2

次のシナリオを実現したいと思います。(例)

私は3つのクラスを持っています:

  1. コントローラ
  2. アップル

public class Apple implements IBonus {
    public String name;
    public String weight;
}


public class Car implements IBonus{
    public String brand;
    public String vmax;
    public String power;
}

public class Controller {
    public List<String> values;

    public void doWork(IBonus bonusObject){
       if(bonusObject instanceOf Car){
          Car c = (Car)bonusObject;
          values.add(c.brand);
          values.add(c.vmax);
          values.add(c.power);
       }
       if(bonusObject instanceOf Apple){
          Apple a = (Apple)bonusObject;
          values.add(a.name);
          values.add(a.weight);
       }
    }
}

今、私はリンゴや車のような多くのクラスを持っています. また、近い将来、各クラスの一部の変数が変更、追加、または削除される可能性もあります。これは、コントローラ クラスのコードを常に調整する必要があることを意味します。

誰か適切なパターンを知っていますか?

4

4 に答える 4

7

これにはパターンは必要ありません。単純な古いポリモーフィズム:

public interface IBonus {
    void fillStringList(List<String> values);
}
...

public void doWork(IBonus bonusObject){
   bonusObject.fillStringList(values);
}
于 2012-06-25T11:12:32.533 に答える
4

編集:デザインパターン「ビジター」。

iBonus インターフェイスを変更してメソッドを追加します。

void add(List<String> values);

コントローラーに代わりに実行させる

bonusObject.add(values);

このようにして、特定のタスク (「値」にオブジェクトを追加する) を特定の実装に委譲します。

基本的に、上記のようなコード (instanceof または switch() の場合) を書いていることに気付いたときはいつでも、代わりにタスクを抽象メソッドに委譲することを検討する必要があります。

「二重発送」別名を検討することをお勧めします。"ビジター"

http://en.wikipedia.org/wiki/Visitor_pattern

ウィキペディアのバージョンは非常に汎用的で、「訪問者」ロジック (リストへの追加) を別のクラスに分割します。以下のバージョンでは、「ボーナス」オブジェクトがその役割を果たし、代わりに二重ディスパッチ構造が使用されます。

このシナリオでは、ボーナス オブジェクト用とコントローラー用の 2 つのインターフェイスがあります。ボーナスオブジェクトには、と呼ばれるメソッドがあります

void visit(Controller c);

次に、コントローラーは次のようにボーナス オブジェクトを呼び出します。

bonusObjecv.visit(this);

「ビジター」の主な目的は、互いに独立して実装を変更できるようにすることです。これは、単純なポリモーフィック ソリューションのより一般的なバージョンです。List などのジェネリック クラスを使用する代わりに、Controller インターフェイスを使用します。このようにして、コントローラーと訪問したオブジェクト間の相互作用を明示的にします。

于 2012-06-25T11:11:07.150 に答える
2

メソッドを追加できます:

public List<String> getValues();

IBonus インターフェイスに追加し、doWork で次を使用します。

values.addAll(bonusObject.getValues());

各 IBonus タイプは、リストの作成方法を実装する必要があります。

于 2012-06-25T11:12:01.103 に答える
-2

この状態ならファクトリーパターンが似合うと思います。

工場パターン例

于 2012-06-25T11:10:05.763 に答える