繁体   English   中英

GWT 序列化和装饰器模式

[英]GWT serialization and decorator pattern

我使用装饰器模式来描述动作,我想在 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;
  }
}

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

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

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

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

我试过你的代码,它按预期工作。

我使用了你发布的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。 希望这有助于确定您的问题。 如果没有,请提供更多详细信息。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM