2010-07-20 5 views
3

나는 동작을 설명하기 위해 데코레이터 패턴을 사용하고, RPC는 거래 후GWT는 직렬화 및 장식 패턴

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로 설정됩니다.

내 객체를 재구성하기 위해 기본 (0 인수) 생성자가 호출 되었기 때문에 내 데코레이터와 데코 레이팅 된 액션 모두 isDecorated (false)의 기본값을 갖습니다.

"_decoratedAction.isDecorated = true;"를 복사 할 수 없습니다. 그 시점에서 _decoratedAction가 초기화되지 않았기 때문에 (ActionDecorator의 0 인수 생성자에서). ... 내가 수동으로 각 트랜잭션 후에 부울을 설정할 수 있지만, 추가 개체 초기화를 (느릅 나무 잊어 가능)마다 내 동료가 작업 개체를 사용하려는 피하기 위해 더 좋을 것이다

물론

답변

0

어쩌면 당신은 isDecorated를 메서드로 바꿀 수 있고 Action에서 항상 false를 반환하고 ActionDecorator에서 항상 true를 반환하도록 재정의 할 수 있습니다. isDecorated의 목적은 무엇입니까? 액션 또는 그 사용자가 액션이 꾸며졌는지 여부를 알아야하는 이유는 무엇입니까?

+0

ActionDecorator의 메소드를 오버라이드 (override) 할 수 없습니다. 데코레이터를 장식 할 수 있습니다. isDecorated의 필요성은 구현에 따라 매우 다르며 여기서는 실제로 문제가되지 않습니다. A의 생성자가 초기화/수정하려는 객체 B를 취하는 경우 네트워크를 통해 A를 전송하는 방법을 파악할 수 없습니다 내가 B에게 한 수정을 풀지 않고 – Garagos

0

RPC 호출의 동작 개체는 어떻게됩니까? 그들은 어딘가에 머물러 있 었는가? 그렇다면 지속성 정의가 올바르지 않을 수 있습니다.

1

나는 코드를 시도했으며 예상대로 작동합니다.

나는 액션ActionDecorator 당신에 의해 게시 된을 사용하지만, 나는 그것의 값을 확인할 수 있도록 나는 _decoratedAction 공개.

나는 다음 두 클래스의 서브 클래스 :

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

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

을하고 액션을 반환하는 서비스 방법을 선언했다.

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

모두가 예상대로 : 이 ActionDecorator의이 거짓 isDecorated 및 을 isDecorated, 내가 작업의 상태를 인쇄

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

클라이언트에서 서비스를 호출 한 후이는 구현 그것으로 장식 된 행동의 진실은 사실입니다. 희망이 당신의 문제를 식별하는 데 도움이됩니다. 그렇지 않은 경우 자세한 내용을 제공해주십시오.

0

부적절하게 작성된 장식 패턴입니다. 데코레이터는 구현되지 않은 모든 메소드를 데코 레이팅 할 객체에 위임해야합니다. 따라서 귀하의 경우 Action 및 ActionDecorator에서 isDecorated에 대한 적절한 접근 자 (getter/setter) 메소드를 가져야합니다. ActionDecorator의 접근 자 메소드는 요청을 _decoratedAction 객체에 위임해야합니다.