9

私はデザインパターンを学び、Go4の本をフォローしようとしています。ページ:179のデコレータパターンの章に、次のような行があります

「..戦略の数を1つから制限のないリストに拡張することで、デコレータを再帰的にネストするのと同じ効果を実現します。」

私はこの声明を完全に理解していませんでした。

戦略は、動的に設定でき、設定されているクライアントについてあまり知らない独立したアルゴリズムを持つことに焦点を当てています。

デコレータは、デコレートするクライアントから完全に独立しているわけではありません。実際、それらはそれらが飾るオブジェクトと同じスーパータイプです。

私はここでポイントを逃していますか?

4

5 に答える 5

15

これを理解するために必要だと思う文脈をもう少し引用します。

Componentクラスが本質的に重い状況では、戦略がより適切な選択であるため、Decoratorパターンを適用するにはコストがかかりすぎます。ストラテジーパターンでは、コンポーネントはその動作の一部を別のストラテジーオブジェクトに転送します。ストラテジーパターンを使用すると、ストラテジーオブジェクトを置き換えることで、コンポーネントの機能を変更または拡張できます。

たとえば、コンポーネントで境界線の描画を別のBorderオブジェクトに延期することで、さまざまな境界線スタイルをサポートできます。Borderオブジェクトは、境界線描画戦略をカプセル化するStrategyオブジェクトです。戦略の数を1つから制限のないリストに拡張することで、デコレータを再帰的にネストするのと同じ効果を実現します。

つまり、両方のパターンを使用してベースコンポーネントに動作を追加でき、Decoratorを使用すると、複数の動作を追加するためにデコレータをネストできますが、Strategyを使用する場合は、複数の戦略を使用する必要があります。

戦略は一般にデコレータよりもメインコンポーネントから独立しているというのは正しいですが、デコレータがコンポーネントを認識している可能性があります。また、ストラテジーパターンを使用するために、メインコンポーネントは、デコレーターでは必要とされないストラテジーの存在を認識しています。

于 2010-12-04T17:42:58.803 に答える
6

それらの例を使用するために、スクロールしたり、さまざまな方法で(またはまったく)境界線をペイントしたりできるウィンドウクラスがある場合があります。継承を使用してこれらすべての機能をカバーする場合は、機能の実行可能な組み合わせごとに1つのサブクラスが必要になります(境界なしスクロールなし、境界なしスクロール、境界なしスクロール、境界およびスクロールなど)。クラスの数が急増しているため、機能を追加すると、これは柔軟性のないメンテナンスの悪夢です。

ここで彼らが主張している主なポイントは、この問題をよりよく解決するために、ストラテジーパターンまたはデコレーターパターンのいずれかを使用できるということです。スクロールストラテジーオブジェクトとボーダーストラテジーオブジェクトをカプセル化するWindowクラスを持つことができます。または、Windowオブジェクトを取得して、境界デコレータ内にラップし、スクロールデコレータ内にラップすることもできます。

しかし、あなたはあなたの理解において完全に正しいです。これらは、異なるアプリケーションにつながる異なる特性を持つ2つの異なるデザインパターンです。デコレータを使用すると、コンポーネントは機能を追加しているエージェントを認識しません...そのため、既存のコンポーネントクラスを中心に構築することになりがちです。ストラテジーでは、コンポーネントがさまざまなタスクを実行するためにエージェントを使用している(したがって、知っている)ため、逆になります。これらのエージェントは、通常、管理コンポーネントについて知りません。

于 2010-12-04T17:30:48.380 に答える
1

何かに対して複数のアプローチを使用したい場合は、戦略パターンを使用してください。オブジェクト/コンポーネント/その他を変更するために特定のものが使用される場合と使用されない場合がある何かを作成したい場合は、デコレータを使用する必要があります。言い換えれば、デコレータはオブジェクトに機能を追加(装飾)する可能性が高く、戦略は機能を交換する可能性が高いと言うこともできます。

于 2013-06-11T13:15:52.430 に答える
0

違いは、ストラテジーパターンでは、1つのストラテジーオブジェクトを使用して、一度にコンテキストに情報を提供できることです。デコレータを使用すると、ストラテジーを互いに積み重ねることができるため、ストラテジーが「オープンエンド」番号と呼ぶものを使用できます。

于 2010-12-04T17:37:22.853 に答える
0

戦略パターンは、オブジェクトのIDが重要な場合に適用できます。適用されるストラテジーの数に関係なく、オブジェクトIDは残りますが、デコレータパターンの場合、オブジェクトは相互にカプセル化され、変換時に元のIDが失われます。

  • デコレータパターンはオブジェクトのスキンを変更します

  • 戦略パターンは、オブジェクトの内臓を変更します。

于 2013-04-17T11:19:43.007 に答える