Head First Design Patterns では、Duckのさまざまなサブクラスに実行時に特定の動作を割り当てることができるDuckの例を使用して、 strategy pattern を説明しています。私の理解から、戦略パターンの目的は、実行時に単一のオブジェクトの動作を変更することですが、さまざまな動作を変更するためにDuckの継承を使用していますアヒルの種類。
Duckのコンテキスト継承は戦略パターンと無関係であるか、またはDuckタイプを変化させ、その動作を変化させることも、戦略パターンを採用する正当な理由ですか?両方を変化させる必要があるので、戦略パターンを使用するのに十分な理由がありますか?なぜこれを戦略パターンの例として含めるのですか?
Duckクラス(派生クラスなし)だけでこの例をさらに簡略化できますか?次に、1つのduckオブジェクトを実装するときに、独自のオブジェクトタイプに依存しない特定の状況に基づいて、異なる動作を割り当てることができます。たとえば、FlyBehaviorは天気に基づいて変化し、QuackBehaviorは時刻またはアヒルの空腹度に基づいて変化します。これは本の問題とは異なる問題を解決することになると思いますが、私が探しているのは、頼りになる適切な戦略パターンの例です。
上記の私の例も戦略パターンを構成しますか?
私は、コンテキスト継承なしの単なる戦略パターンである、より厳密に準拠した2つの単純な戦略パターンの例を見つけることに成功しました: Hunter.Java および solver.py 。
はい、私はあなたが正しい軌道に乗っていると思います。戦略パターンを使用するクラスは、サブクラスである必要はありません。戦略パターンは、コードの再利用のために継承するalternativeです。これは、継承と構成のさらに広い比較に戻ります。
設計パターン:再利用可能なOOPの要素から、戦略パターンを使用して
継承を使用してクワックとフライの動作を実装した場合、これらすべてのサブクラスが動作のすべての組み合わせを表すことになります。
非常に多くのサブクラスがあると、保守が難しくなるため、この場合は戦略パターンが優先されます。 FlyabilityとQuackabilityをカプセル化する2つのプロパティが必要であり、新しいクラスを作成せずにこれらを混合して一致させることができます。
また、天候が変化した場合に、カモのFlyプロパティが条件によりNoFlyオブジェクトに置き換えられる場合の実行時のメリットについてもすでに説明しました。
これは、可能であれば継承よりも構成を優先するというアドバイスと一致しています。
Duckクラス(派生クラスなし)だけでこの例をさらに簡略化できますか?次に、1つのduckオブジェクトを実装するときに、独自のオブジェクトタイプに依存しない特定の状況に基づいて、異なる動作を割り当てることができます。
もちろん。インスピレーションについては Head First Object-Oriented Analysis and Design をご覧ください。 (リック)Instrumentサブクラスの爆発を示す「リックのギター」があります。これを修正するには、さまざまな動作をすべて「仕様」クラスにラップし、変化するものをカプセル化するという原則に従ってカプセル化します。
Abstract Factory-Context Based Construction
ここにパターンがあります 。ところで、それ自体が戦略を使用していることに注意してください。
実装ではなく概念に焦点を当てています...日当たりまたは雨などの条件に基づいてspecificationオブジェクトを構築する「WeatherFactory」があるかもしれません。
あなたはそれらの「NoFlyInFogQuackableMallard」ものを構築するために「ファクトリーのファクトリー」を持つことができます。そして実際、これが抽象ファクトリー・パターンに関するものです。したがって、おそらく、一般的なアヒル型を作成するDuckFactory、次にそれにアヒル型固有の霧の天気の振る舞いを与えるWeatherFactoryがあります。