2011-08-04 27 views
0

私はデザインパターンに関しては初心者です。戦略パターン/このような実装の考え方:デフォルト戦略の戦略パターン

 
public class SomeClass { 

    private Strategy strategy = new DefaultStrategy(); 

    public void provideCustomStrategy(Strategy strategy) { 
     this.strategy = strategy; 
    } 
} 

このようにすれば、戦略パターンとDIのすべての利点が緩和されます。同時に、ユーザーに戦略を提供するよう強制することはなく、ユーザーはコーナーケースなどのカスタム戦略を提供することもできます。コンストラクターにストラテジーを提供する場合、コンストラクターインジェクションで同じ目標を達成できます-parameter。私はこの実装が多くの場合に最大限の柔軟性を提供すると思います。

+1

関連:http://stackoverflow.com/questions/6733667/is-there-an-alternative-to-bastard-injection-aka-poor-mans-injection-via-defau –

+0

ありがとう!その投稿は物事をクリアしました! –

答えて

1

このアプローチの欠点は、DefaultStrategyクラスへの永続的な結合があることです。それが重要な荷物を持って来たら、将来これを後悔するかもしれません。

代わりに、何らかの遅延バインディングを使用することもできます。デフォルトの戦略を持っていないので、という名前のデフォルト戦略のがあります。実行時に、最初の使用時に、対応するクラスをロードする名前を検索します。今度は、名前クラスマッピングを調整して戦略を制御するオプションがあります。

これは、JEEのリソースルックアップによって有効になる可能性の1つです。

+1

良いアイデア。私はあなたがヌルチェックを使用して、カスタムが提供されていない場合、デフォルト戦略をインスタンス化することもできると思います。怠惰なinitのようなもの。 –

0

私が考える最も重要なことは、この実装はあなたのニーズに最も適していると思いますか?私はsetterを提供することに同意します(私はsetStrategyに名前を変更します)が、クライアントはどの戦略が利用可能かを正確に知る必要があります。その情報をクライアントに提供できる方法の1つは、利用可能な各戦略を保持する列挙体を使用することです。その後、クライアントは必要に応じてそれらを「ホットスワップ」できます。

私のサンプルコードはwww.jasonsjavadocs.com/XHTML/DesignPatterns.htmlの「戦略」のセクションにあります。