Strategy パターン (一連のアルゴリズム (戦略) をカプセル (部品化) し, 動的なアルゴリズムの切り替えを可能とする)

[Strategy] = [戦略]. ここで言う戦略とは, アルゴリズムのことを指す.

このパターンを適用すると, 状況に応じた戦略に便宜変更することが容易となる.

つまり, [Strategy] パターンとは, 使用する側には意識させることなく, 柔軟に, また簡単に戦略 (アルゴリズム) を切り替えることを可能とするパターンである.

役割

  1. Strategy (戦略):
戦略のインタフェースを定義する.
  1. ConcreteStrategy[A|B] (具体的戦略) の役:
[Strategy] が定義したインタフェースを実装する. 具体的な戦略を作成する.
  1. Context (状況判断):
状況により [ConcreteStrategy] を切替その戦略を利用する. 利用するのは, あくまで [Strategy] で定義したメソッドである.
  1. Client (利用者):
[Strategy] パターンを適用したクラスを用い処理を行う.

クラス図

Strategy パターンのクラス図 (1)

_images/designpattern-strategy012.gif

Strategy パターンのクラス図 (2)

ファクトリーパターンを用いた場合 (オブジェクト生成判断処理を別クラスに切り出し(使用者からの隠蔽))

_images/designpattern-strategy022.gif

ソースコード

  1. Strategy.java
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. Context.java
 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. Client.java
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