我使用decorator模式来描述操作,我希望在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,其中包含一个操作,但是decoratedaction的isdecorated成员被设置为false。
由于调用默认(零参数)构造函数来重新构造我的对象,所以我的decorator和我的decorated操作都将获得isdecorated(false)的默认值。
我无法复制ActionDecorator的零arg构造函数中的“\u decoratedAction.isDecorated=true;”,因为此时未初始化(null)。
当然,我可以在每个事务之后手动设置布尔值,但是最好避免每次我的同事想要使用action对象时额外的对象初始化(可能会忘记)。

最佳答案

我已经试过你的代码了,它的工作和预期的一样。
我使用了你发布的action和actiondecorator,但是我将decoratedaction公开了,这样我就可以检查它的值了。
然后我对这两个类进行了子类划分:

class MyAction extends Action {
    public MyAction() {}
}

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

并声明了将返回操作的服务方法。这是它的实现:
public Action getAction() {
    return new MyActionDecorator(new MyAction());
}

从客户端调用服务后,我打印操作的状态:
System.out.println(action.isDecorated); // false
System.out.println(((ActionDecorator) action)._decoratedAction.isDecorated); // true

一切如期而至:actiondecorator的is decorated为false,由它修饰的action的isdecorated为true。希望这有助于识别你的问题。如果没有,请提供更多细节。

09-16 03:27