strategyは日本語で「戦略」という意味になる.Strategyパターンは,アルゴリズムの集合を定義し,各アルゴリズムをカプセル化して互いに入れ替え可能にするパターンである.
Strategyパターンの主な要素は以下である.
java// Strategy
interface Strategy {
public void execAlgorithm();
}
// Concrete Strategy
class ConcreteStrategyA implements Strategy {
@Override
public void execAlgorithm() {
System.out.println("ConcreteStrategyA execAlgorithm");
}
}
class ConcreteStrategyB implements Strategy {
@Override
public void execAlgorithm() {
System.out.println("ConcreteStrategyB execAlgorithm");
}
}
// Context
class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void exec() {
strategy.execAlgorithm();
}
}
// Client
public class StrategyPattern {
public static void main(String[] args) {
Strategy strategyA = new ConcreteStrategyA();
Strategy strategyB = new ConcreteStrategyB();
Context contextA = new Context(strategyA);
Context contextB = new Context(strategyB);
contextA.exec();
contextB.exec();
}
}
オブジェクトのアルゴリズム(振る舞い)だけを変えるケースは想像しやすい.例えば,クレジットや現金といった支払い方法の切り替えなどがある.
同じ様なことはTemplate Methodでも実現できる.Template Methodとの違いは,Template Methodだとオブジェクトのプロパティを扱いやすいのに対して,Strategyだとあくまで部外者的立場にあるので,オブジェクトのプロパティは扱いにくい.
部分的な違いか,オブジェクト全体に及ぶ違い化でTemplate MethodとStrategyを使い分けるといいだろう.