意図
一連のアルゴリズムを定義し、各アルゴリズムをカプセル化して、それらを交換可能にします。
ストラテジーモードでは、アルゴリズムを使用するクライアントから独立させることができます。
クラス図
- Strategyインターフェースは、一連のアルゴリズムを定義し、そのすべてがbehavior()メソッドを実装します。
- Contextは、このアルゴリズムファミリを使用するクラスです。doSomething()メソッドはbehavior()を呼び出し、setStrategy(Strategy)メソッドは戦略オブジェクトを動的に変更できます。つまり、Contextが使用するアルゴリズムを動的に変更できます。
実装
呼び出しを動的に変更できるアヒルを設計します。ここでのアルゴリズムファミリは、アヒルの呼び出し動作です。
public interface QuackBehavior {
void quack();
}
public class Quack implements QuackBehavior {
@Override
public void quack() {
System.out.println("quack!");
}
}
public class Squeak implements QuackBehavior{
@Override
public void quack() {
System.out.println("squeak!");
}
}
public class Duck {
private QuackBehavior quackBehavior;
public void performQuack() {
if (quackBehavior != null) {
quackBehavior.quack();
}
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}
public class Client {
public static void main(String[] args) {
Duck duck = new Duck();
duck.setQuackBehavior(new Squeak());
duck.performQuack();
duck.setQuackBehavior(new Quack());
duck.performQuack();
}
}
squeak!
quack!
JDK
- java.util.Comparator#compare()
- javax.servlet.http.HttpServlet
- javax.servlet.Filter#doFilter()