「Strategy」という英単語は、「戦略」を意味します。ここで言う戦略とは、アルゴリズムの事を指します。
このパターンを適用すると、状況に応じた戦略に便宜変更することが容易となります。つまり、「Strategy」パターンとは、使用する側には意識させる事なく、柔軟に、また簡単に戦略(アルゴリズム)を切替えることを可能とするパターンです。
「Strategy」が定義したインタフェースを実装します。
具体的な戦略を作成します。
状況により「ConcreteStrategy」を切替えその戦略を利用します。
利用するのは、あくまで「Strategy」で定義したメソッドです。
■ Strategyパターンのクラス図(1)
■ Strategyパターンのクラス図(2) ※ファクトリー・パターンを用いた場合(オブジェクト生成判断処理を別クラスに切出し(使用者からの隠蔽))
1. Strategy.java
public interface Strategy {
public abstract String strategyMethod();
}
2-1. ConcreteStrategyA.java
public class ConcreteStrategyA implements Strategy {
public String strategyMethod() {
return "戦略A";
}
}
2-2. ConcreteStrategyB.java
public class ConcreteStrategyB implements Strategy {
public String strategyMethod() {
return "戦略B";
}
}
3. Context.java
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
setStrategy(strategy);
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public String contextMeshod() {
return strategy.strategyMethod();
}
}
4. Client.java
public class Client {
public static void main(String[] args) {
Context context = new Context(new ConcreteStrategyA());
System.out.println(context.contextMeshod());
context.setStrategy(new ConcreteStrategyB());
System.out.println(context.contextMeshod());
}
}
C:\sample\desin_pattern\strategy\01>javac Client.java [Enter] C:\sample\desin_pattern\strategy\01>java Client [Enter] 戦略A 戦略B
1. Strategy.java
public interface Strategy {
public abstract String strategyMethod();
}
2-1. ConcreteStrategyA.java
public class ConcreteStrategyA implements Strategy {
// ストラテジオブジェクトにIDを保持させる。オブジェクト生成するときの判断に使用する。
public static final int ID = 1;
public String strategyMethod() {
return "戦略A";
}
}
2-2. ConcreteStrategyB.java
public class ConcreteStrategyB implements Strategy {
public static final int ID = 2;
public String strategyMethod() {
return "戦略B";
}
}
3. Context.java
public class Context {
private Strategy strategy;
public Context(int id) {
setStrategy(id);
}
public void setStrategy(int id) {
// オブジェクト生成を「StrategyFactory」に切り出します。
this.strategy = StrategyFactory.createStrategy(id);
}
public String contextMeshod() {
return strategy.strategyMethod();
}
}
4. Client.java
public class Client {
public static void main(String[] args) {
Context context = new Context(ConcreteStrategyA.ID);
System.out.println(context.contextMeshod());
context.setStrategy(ConcreteStrategyB.ID);
System.out.println(context.contextMeshod());
}
}
5. StrategyFactory.java
public class StrategyFactory {
public static Strategy createStrategy(int id) {
Strategy strategy = null;
switch (id) {
case ConcreteStrategyA.ID:
strategy = new ConcreteStrategyA();
break;
case ConcreteStrategyB.ID:
strategy = new ConcreteStrategyB();
break;
}
return strategy;
}
}
C:\sample\desin_pattern\strategy\02>javac Client.java [Enter] C:\sample\desin_pattern\strategy\02>java Client [Enter] 戦略A 戦略B