[Strategy] = [戦略]. ここで言う戦略とは, アルゴリズムのことを指す.
このパターンを適用すると, 状況に応じた戦略に便宜変更することが容易となる.
つまり, [Strategy] パターンとは, 使用する側には意識させることなく, 柔軟に, また簡単に戦略 (アルゴリズム) を切り替えることを可能とするパターンである.
戦略のインタフェースを定義する.
[Strategy] が定義したインタフェースを実装する. 具体的な戦略を作成する.
状況により [ConcreteStrategy] を切替その戦略を利用する. 利用するのは, あくまで [Strategy] で定義したメソッドである.
[Strategy] パターンを適用したクラスを用い処理を行う.
Strategy パターンのクラス図 (1)
Strategy パターンのクラス図 (2)
ファクトリーパターンを用いた場合 (オブジェクト生成判断処理を別クラスに切り出し(使用者からの隠蔽))
1 2 3 | public interface Strategy{
public abstract String strategyMethod();
}
|
2-1. ConcreteStrategyA.java
1 2 3 4 5 | public class ConcreteStrategyA implements Strategy{
public String strategyMethod(){
return "戦略 A";
}
}
|
2-2. ConcreteStrategyB.java
1 2 3 4 5 | public class ConcreteStrategyB implements Strategy{
public String strategyMethod(){
return "戦略 B";
}
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public class Context{
private Strategy strategy;
public Context(Strategy strategy){
setStrategy(strategy);
}
public void setStrategy(Strategy strategy){
this.strategy = strategy;
}
public String contextMethod(){
return strategy.strategyMethod();
}
}
|
1 2 3 4 5 6 7 8 9 | public class Client{
public static void main(String[] args){
Context context = new Context(new ConcreteStrategyA());
System.out.println(context.contextMethod());
context.setStrategy(new ConcreteStrategyB());
System.out.println(context.contextMethod());
}
}
|
上記のプログラムの実行結果:
[wtopia Strategy]$ java Client
戦略 A
戦略 B