策略パターンは、特定の問題のアルゴリズムのセットに対応し、ユーザーがこれらのアルゴリズムの中から適切なアルゴリズムを選択できるようにします。具体的なビジネス要件に基づいて、既存のコードを変更せずに新しいアルゴリズム戦略を追加することができます。これにより、アルゴリズムまたはビジネスが独立しているだけでなく、統一的な切り替えと呼び出しも可能になります。
- 関連する概念
- 使用シーン
- 実装
関連する概念#
- 抽象戦略ロール:通常、インターフェースを使用して戦略メソッドを統一的に定義します。
- 具体的な戦略ロール:具体的な戦略アルゴリズムをカプセル化します。
- 環境ロール:戦略アルゴリズムの統一的な外部メソッドをクライアントが呼び出します。
使用シーン#
- 同じ種類のビジネスであるが、具体的な振る舞いが異なるビジネスに適しています。例えば、仕入れ価格を仕入れ数量の違いに基づいて異なる仕入れ価格を提供する場合です。
- 異なるアルゴリズムの切り替えが容易で、既存のコードを変更することを避けることができるビジネスに適しています。例えば、Android 開発で複数の画像フレームワークの切り替えが必要な場合、ストラテジーデザインパターンを使用してカプセル化すると、画像の読み込みフレームワークを簡単に切り替えることができ、既存のコードの再修正を回避できます。
実装#
以下は、旅行者の旅行方法を例にしてストラテジーデザインパターンを実装する方法です。
/**
* 抽象戦略ロール
*/
public interface IStratey {
// 旅行
void trip();
}
次に、具体的な戦略ロールを作成します。
- 飛行機に乗る:
/**
* 具体的な戦略ロール
*/
public class AirStrategy implements IStratey{
@Override
public void trip() {
System.out.println("飛行機に乗る!");
}
}
- 歩く:
/**
* 具体的な戦略ロール
*/
public class PersonStrategy implements IStratey{
@Override
public void trip() {
System.out.println("歩く!");
}
}
- 電車に乗る:
/**
* 具体的な戦略ロール
*/
public class TrainStrategy implements IStratey{
@Override
public void trip() {
System.out.println("電車に乗る!");
}
}
次に、環境ロールを作成します。
/**
* 環境ロール
* 具体的な戦略との相互作用に使用され、アルゴリズムとクライアントの呼び出しを分離し、アルゴリズムをクライアントから独立させ、アルゴリズム戦略の切り替えを容易にします。
*/
public class Context {
private IStratey iStratey;
public Context(IStratey iStratey) {
super();
this.iStratey = iStratey;
}
public void setiStratey(IStratey iStratey) {
this.iStratey = iStratey;
}
// 具体的なビジネスロジック
public void tripType() {
iStratey.trip();
}
}
最後に、クライアントの呼び出しを行います。
/**
* クライアントの呼び出し
*/
public class StrategyClient {
public static void main(String[] args) {
// 具体的な戦略ロールを作成
IStratey stratey = new AirStrategy();
// 環境ロールを作成し、必要な戦略を自由に切り替えることができます
Context con = new Context(stratey);
// 具体的なアルゴリズムを呼び出す
con.tripType();
}
}
上記のコードの出力結果は次のとおりです。
飛行機に乗る!
これは比較的単純な例ですが、実際的な意味を持たないかもしれません。今日は、ストラテジーデザインパターンの使用方法をまとめました。一方で、Android 開発での画像読み込みフレームワークのカプセル化にストラテジーデザインパターンを使用する予定です。今日の記事はここまでです。