0

このチュートリアルを使用して、戦略パターンを調べてきました。彼が話している出力を受け取りましたが、digHole() メソッドを使用するオプションがないようです。Dog() コンストラクターでメソッドを呼び出すと、機能します。

これは、アニマル クラスで掘る能力 (飛行能力など) を保存する方法を実装する必要があるためだと思いますが、これで正しいでしょうか? これはまた、動物に実行させたいすべてのアクションについて、Animal クラスで構成し、能力を備えたインターフェイスを作成してから、その能力を実装する 2 つのクラスを作成する必要があるということですか。つまり、能力が実装されているか実装されていないかのどちらかです?

また、ストラテジー パターンの背後にある主な考え方を定式化する際にも、いくつかの問題があります。現在、私はそれを「すべてのアクションをカプセル化し、それらを 1 つのメイン クラスにまとめる」と考えています。これはどの程度正確/適切ですか?

public class Animal {

    public Flies flyingType;

    public String tryToFly() {
        return flyingType.fly();
    }

    public void setFlyingAbility(Flies newFlyType) {
        flyingType = newFlyType;
    }
}


public class Dog extends Animal {

    public Dog() {
        super();
        setSound("Bark");
        flyingType = new CantFly();
    }

    public void digHole() {
        System.out.println("Dug a hole");
    }
}


public interface Flies {

    String fly();

}

class ItFlies implements Flies {

    public String fly() {
        return "Flying high";
    }

}
class CantFly implements Flies {

    public String fly() {
        return "I can't fly";
    }

}
4

3 に答える 3

2

また、戦略パターンの背後にある主な考えを定式化するのにも問題があります

おそらく、Strategy パターンを理解するための最良の方法は、それをTemplate メソッドと比較することです。ウィキペディアの記事へのリンクをクリックしてください。

どちらも、基本クラスで事前に特定の設計上の決定を行う必要がありますが、最終的にさまざまなサブクラスに異なる動作を指定することになると、テンプレート パターンは継承に依存し、基本/スーパー クラスで定義された抽象メソッドをオーバーライドします。

戦略パターンは構成に依存します。動作 (飛行、掘削) はそれ自体がオブジェクトであり、個別に作成して対象のオブジェクトに注入することができます。

Java のような言語では、基本クラスのメソッドをオーバーライドしてオブジェクトのインスタンスを作成すると、その動作は変更できません。オブジェクトをそのように動作させたい場合は、継承を使用してください。ただし、必要な動作が実行時までわからない場合は、戦略パターンを使用して設計するために余分な努力をする価値があります。

能力が実装されているか、実装されていないことを意味しますか?

参照しているチュートリアルはかなり巧妙ですが、戦略パターンを使用するための優れたモデルではありません。犬に飛行能力を追加することは直感に反するため、レッスンの邪魔になります。戦略パターンでは、目的のアルゴリズムの可能な実装の数に制限はありません。

本当に動物モデルに固執したい場合はfindFoodescapeFromPredatorfindMate、などのより普遍的な概念を試すことができますraiseYoung。これは、すべての動物にとって意味がありますが、すべての動物インスタンスでまったく同じになるわけではありません。2 匹の異なる犬raiseYoungは、時間の経過とともにまったく異なるか、異なる動作をする可能性があるため、動物のシミュレーションが続行するにつれて、戦略を交換する必要がある場合があります。

メインクラスのすべてのメソッドを作成する必要がありますか?

できますが、面倒な場合は必要ありません。クラスの使用を簡素化するために、各オブジェクトに独自のコンストラクターで適切な戦略をインスタンス化させることができます。次に、アプリケーションに応じて、オブジェクトを作成してデフォルトの動作を使用するか、デフォルトの動作を別の動作に置き換えるかを選択できます。

于 2012-12-10T22:44:54.453 に答える
0

Animalで抽象メソッドを作成するだけで、Animalクラスも抽象になりますが、一般的に動物とは何であるかは意味がないため、気にしません。そして、Animalを継承する各クラスで、このメソッドの実装を定義します。

これはパターン戦略ではありませんが、(私が理解したように)やりたいことを行うための良い方法の1つだと思います

于 2012-12-10T22:03:07.320 に答える
0

私が理解しているパターン戦略の考え方は、サブクラスが同じ種類の動作を異なる方法で定義するということです。

したがって、100 種類の動物がいて、飛ぶことしかできない動物、掘ることしかできない動物、両方できる動物がいる場合、スーパークラスのメソッドとしてflyとの両方を使用できます。digHole

ただし、すべての動作をスーパークラスに組み込むことではありません。犬だけが穴を掘ることができ、それが一般の動物にとって意味をなさない場合、あなたが入れても意味がありませdigHoleAnimal。犬を掘るには、おそらくそれがDogとにかく であるかどうかを知っておく必要があります。または、メソッドを使用できるように から に移動する場合 (たとえば、リストからすべての犬を取得する場合) は、 を使用AnimalできDogますAnimal明示的なキャストdigHole

于 2012-12-10T22:12:45.190 に答える