Strategy は、 振る舞いに関するデザインパターンの一つで、 一連の振る舞いをオブジェクトに転換し、 元のコンテキスト・オブジェクト内で交換可能とします。
元のオブジェクトは、 コンテキストと呼ばれ、 一つのストラテジー・オブジェクトへの参照を保持し、 それに振る舞いの実行を委任します。 コンテキストがその作業を実行する方法を変えるために、 他のオブジェクトが、 現在リンクされているオブジェクトを違うものと置き換えるかもしれません。
複雑度:
人気度:
使用例: Strategy パターンは、 Java コードではよく見かけます。 種々のフレームワークで、 クラスの拡張をせずに、 その振る舞いを変更できるようにするためによく使われます。
Java 8 で導入されたラムダ関数は、 Strategy パターンの単純な代替として使えます。
Java のコア・ライブラリーでの Strategy の使用例です:
見つけ方: 入れ子になったオブジェクトに何か実際の作業をさせるメソッドや、 そのオブジェクトを他のものと入れ替えるための setter の存在で、 Strategy パターンを識別できます。
電子商取引アプリでの支払い方法
この例では、 Strategy パターンを使用して、 電子商取引プリケーションでさまざまな支払い方法を実装します。 購入する商品を選択した後、 顧客は Paypal またはクレジットカードのいずれかの支払い方法を選択します。
具象ストラテジーは、 単に実際の支払いを実行するだけではなく、 チェックアウト用フォームの動作を変更して、 支払いの詳細を記録するための適切なフィールドが存在するようにします。
strategies
strategies/PayStrategy.java: 支払いメソッドの共用インターフェース
strategies/PayByPayPal.java: PayPal での支払い
strategies/PayByCreditCard.java: クレジットカードでの支払い
strategies/CreditCard.java: クレジットカード・クラス
order
order/Order.java: 注文クラス
Demo.java: クライアント・コード
OutputDemo.txt: 実行結果