1

あるオブジェクトが受信した通話を他のオブジェクトに転送するために、複合パターンを使用したいと思います。

現在、受信側のオブジェクトはすべて同じAbstractタイプですが、具体的なタイプに応じて、パラメーターとしてさまざまなタイプのオブジェクトを選択的に受け入れるという問題があります(さまざまなモデルを考えてください)。

私が見る限り、2つの解決策がありますが、どちらも満足のいくものではありません。

  • instanceofを使用して、入力側のクラスタイプオブジェクトを検出します。これはよく悪い習慣だと言われます。
  • Lists入力タイプと同じ数を作成します。これにより、List新しい入力タイプに対応するためにaを追加する必要があり、それぞれListを明示的に順番に処理する必要があるという問題が発生します。

私はインターフェースの観点から考えてきましたが、まだ実現可能なアイデアを思い付いていません。この設計上の問題の解決策は何でしょうか?コンポジットはまったく適切ですか?

PS:これはMVCのコンテキストにあります。

4

2 に答える 2

2

複合パターンを使用すると、オブジェクトのコレクションを葉のオブジェクトと同じように扱うことができます。

私はあなたがこのようなことをすることができると言うでしょう:

public interface Command
{
    void execute(Object parameter);
}

public class LeafCommand implements Command
{
    public void execute(Object parameter)
    {  
        // do something for a leaf
    }
}

public class CompositeCommand implements Command
{
    private List<Command> commands;

    void execute(Object parameter)
    {
        for (Command child : commands) 
        { 
           child.execute(parameter);
        }
    }

}

それがCompositeが私にとって意味することです。あなたは正しいです-あなたが使用しなければならないなら、あなたはinstanceofそれを間違ってしました。

于 2010-07-12T22:22:45.450 に答える
0

JavaPractisesのStocksMonitorアプリケーションで次のアプローチを見つけました。これは、mvcコンテキストでのメインビューの更新メソッドです。

  public void update(Observable aObservable, Object aData) {
    fLogger.fine("Notify being broadcast...");
    if (aObservable == fCurrentPortfolio) {
      fLogger.fine("Notified by Current Portfolio...");
      synchTitleBarWithCurrentPortfolio();
    }
    else if (aObservable == fGeneralLookPrefs) {
      fLogger.fine("Notified by General Look...");
      synchGuiWithGeneralLookPrefs();
    }
  }

参照は、対応するビューを選択的に更新するために使用されるさまざまなモデルのインスタンスです。このアプローチは複合パターンを尊重し、パラメータインスタンスに従ってケースバイケースの処理を可能にします。もちろん、これは実行時に使用されているモデルの1つのインスタンスのみに依存します。

于 2010-07-13T13:18:56.127 に答える