【问题标题】:GWT serialization and decorator patternGWT 序列化和装饰器模式
【发布时间】:2011-03-18 08:44:19
【问题描述】:

我使用装饰器模式来描述动作,我想在 RPC 调用中使用这些动作

public abstract class Action implement Serializable
{
  boolean       isDecorated = false;
  public Action() {} // default constructor for Serialization
}

public abstract class ActionDecorator extends Action
{
  private   Action  _decoratedAction;

  public ActionDecorator()  // default constructor for Serialization
  {}

  public ActionDecorator(Action action)
  {
    _decoratedAction = action;
    _decoratedAction.isDecorated = true;
  }
}

交易完成后,我收到了一个包含 Action 的 DecoratorAction,但 _decoratedAction 的 isDecorated 成员设置为 false。

由于调用了默认(零参数)构造函数来重新构造我的对象,因此我的装饰器和我的装饰动作都将获得默认值 isDecorated (false)。

我无法复制“_decoratedAction.isDecorated = true;”在 ActionDecorator 的零参数构造函数中,因为 _decoratedAction 当时没有初始化(null)。

当然我可以在每次交易后手动设置布尔值,但每次我的同事想要使用 Action 对象时,最好避免额外的对象初始化(可以忘记)...

【问题讨论】:

    标签: java design-patterns serialization gwt decorator


    【解决方案1】:

    这只是一个不正确的装饰器模式。装饰器应该将所有未实现的方法委托给被装饰的对象。因此,在您的情况下,您应该在 Action 和 ActionDecorator 中为 isDecorated 提供适当的访问器(getter/setter)方法。 ActionDecorator 中的访问器方法应该将请求委托给 _decoratedAction 对象。

    【讨论】:

      【解决方案2】:

      我已经尝试过您的代码,它可以正常工作。

      我使用了您发布的 ActionActionDecorator,但我将 _decoratedAction 公开,以便检查其值。

      然后我对这两个类进行了子类化:

      class MyAction extends Action {
          public MyAction() {}
      }
      
      class MyActionDecorator extends ActionDecorator {
          public MyActionDecorator() {}
          public MyActionDecorator(Action a) {
              super(a);
          }
      }
      

      并声明了一个返回Action的服务方法。这是它的实现:

      public Action getAction() {
          return new MyActionDecorator(new MyAction());
      }
      

      从客户端调用服务后,我打印操作的状态:

      System.out.println(action.isDecorated); // false
      System.out.println(((ActionDecorator) action)._decoratedAction.isDecorated); // true
      

      一切如预期:ActionDecorator 的 isDecorated 为 false,而被其修饰的 Action 的 isDecorated 为 true。希望这有助于确定您的问题。如果没有,请提供更多详细信息。

      【讨论】:

        【解决方案3】:

        RPC 调用中的 Action 对象究竟会发生什么?他们在某个地方坚持吗?如果是这样,您的持久性定义可能不正确。

        【讨论】:

          【解决方案4】:

          也许你可以把 isDecorated 变成一个方法,让它在 Action 中总是返回 false,然后在 ActionDecorator 中覆盖它,让它总是返回 true。 isDecorated 的目的是什么?为什么 Action 或其用户需要知道 Action 是否被修饰?

          【讨论】:

          • 在 ActionDecorator 中覆盖方法不起作用:可以装饰装饰器。 isDecorated 的需求对我的实现来说非常具体,并不是真正的问题:如果 A 的构造函数采用我想要初始化/修改的对象 B,我不知道如何通过网络发送 A 而不会丢失我对 B 所做的修改
          猜你喜欢
          • 1970-01-01
          • 2011-07-18
          • 2013-07-01
          • 2014-10-29
          • 2011-03-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多