3

ほとんどのデザインパターンの概念では、「Aを持っている」は「Aを持っている」という意味よりも優れていると言われていました。

最初の章-HeadFirstDesign Patterns- "Intro to Design Patterns"、セクション "Integrating the Duck Behaviour"(15ページ)では、DuckクラスはFlyBehaviorおよびQuackBehaviorインターフェイスタイプへの参照を持っています。たとえば、ある種類のアヒルの機能名XYZBehaviorに新しい動作を追加します(クライアントがまだ決定していないと仮定します)。新しいインターフェイスを参照するようにDuckクラスを変更する必要があります。その結果、クラスを変更する必要がありますが、適切なデザインパターンに従って変更することはできません。

この要件にどのように対処できるか教えていただけますか?

4

3 に答える 3

1

この問題は、依存性注入を使用することで解決できます

(Javaでは通常SpringまたはGuiceを介して)

これが依存性注入の初心者向けガイドです

基本的に、Birdにはbehaviorsプロパティがあります。

private Collection<Behavior> behaviors;
public void setBehaviors(Collection<Behavior> behaviors){
    this.behaviors = behaviors;
}

ここで、構成ファイルで、Birdクラスを変更せずにBirdに注入されるビヘイビアーを指定します。

于 2010-11-09T10:50:45.253 に答える
0

ストラテジーパターンは、新しい動作(ストラテジー)を追加した場合にクラスの変更を妨げることはありません。既存の動作(戦略)が変更された場合に、クラスに触れるのを防ぐだけです。

QuackBehaviourの例:アヒルは「quaack」のように聞こえると思いましたが、数年の調査の結果、アヒルは実際には「quaaack」のように聞こえることに気づきました。幸運なことに、QuackBehaviourを実装し、一般的なアヒルのQuackBehaviourインターフェイスの実装を調整するだけです。これがこのパターンの秘訣です。

後で、別の研究チームが水泳は一般的なアヒルの行動であることに気付いたため、SwimBehaviourを追加することにしました。次に、一般的なアヒルに触れて、その行動を(Duckクラスに)追加する必要があります。

お役に立てば幸いです。

于 2010-11-09T12:09:12.027 に答える
0

このシナリオは、 Composition=>Duckのリストを使用して処理できBehavioursます。

DuckBehaviorオブジェクトのリストを維持します。オブジェクトの作成中に関連する動作を設定しDuckます。

サンプルコード:

import java.util.*;

interface Behaviour{

}
class FlyBehaviour implements Behaviour{

}
class QuackBehaviour implements Behaviour{

}
class XYZBehaviour implements Behaviour{

}

public class Duck{
    private List<Behaviour> duckBehaviours = new ArrayList<Behaviour>();

    public Duck(List<Behaviour> list){
        duckBehaviours = list;
    }
    public static void main(String[] args){
        // set the behaviours
        List<Behaviour> list = new ArrayList<Behaviour>();
        list.add(new FlyBehaviour());
        list.add(new QuackBehaviour());
        list.add(new XYZBehaviour());
        Duck duck = new Duck(list);
    }   
}
于 2016-07-04T15:15:57.110 に答える