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