2011-01-29 18 views
3

は、次のようにコマンドがあるとします。コマンドパターンの質問。明確化が必要。 Javaの

public class PublishLastFiveCommand implements Command { 
    private Producer p; 

    public PublishLastFiveCommand(Producer p) { 
    this.p = p; 
    } 

    public void execute() {\  
    p.publishLastFive(); 
    } 
} 

がさらにプロデューサーがすることができます

public void publishLastFive() { 
    System.out.println("publishing last 5"); 
} 

Command c; 

public void setCommand(Command c) { 
    this.c = c; 
} 

public void execute() { 
    c.execute(); 
} 

質問:

意図している用法は次のとおりです。

Command publish5 = new PublishLastFiveCommand(p); 
p.setCommand(publish5); 
p.execute(); 

ですそこに私を守るための優雅な方法:

p.publishLastFive() 

は直接呼びますか?

答えて

0

[OK]をみんなこれを防ぎたい

出版場合には、他の人が同じ質問を有することができるコマンドで

:。。

作品:

publish5.execute(); 

作品:

p.setCommand(publish5); 
p.execute(); 
012プロデューサー

public void publishLastFive() { 
    if (c != null) {   <--- add null check 
     System.out.println("publishing last 5"); 
    } 
} 

Command c = null; 

public void setCommand(Command c) { 
    this.c = c; 
} 

public void execute() { 
    c.execute(); 
    c = null;    <-- once done executing, set command to null 
} 

広告結果に

@Override public void execute() { p.setCommand(this); <-- add this line p.publishLastFive(); } 

が動作しません。

p.publishLastFive(); 
0

AFAIKはまったくありません。execute()はpublicであるためです。

1

publishLastFive()メソッドを保護すると、同じパッケージ内のオブジェクトだけがそのメソッドにアクセスできます。 (あなたのPublishLastFiveCommandクラスが同じパッケージ内にあると仮定すると、それは問題なくそのメソッドを呼び出すことができますが、他のパッケージでのクライアントコードは、直接publishLastFive()を呼び出すことはできません。

を、私はあなたがnew PublishLastFiveCommand(p).execute();を防止することについて何を意味するのか理解していない。なぜが行います?私はそ​​れを得た、

関連する問題