Strategyパターンは条件分岐をOOP(オブジェクト指向)のポリモフィズムで表現したものです。
分岐数が限定される場合はJavaSE5.0からのenum(列挙型)と組み合わせることができます。
enumにStrategyのインスタンスを持たせる
Javaのenumはクラスの継承型を利用していますので、enumにフィールドやメソッドを持たせることができます。
public enum TestEnum {
TypeA(new Strategy(){
public void exec(){
System.out.println("Strategy A");
}
}),
TypeB(new Strategy(){
public void exec(){
System.out.println("Strategy B");
}
}),
TypeC(new Strategy(){
public void exec(){
System.out.println("Strategy C");
}
}),
; // ;を記述することで、その後にenumのクラスの拡張を記述できる
/** Strategyの保持フィールド */
private final Strategy strategy;
/** enumのコンストラクタ */
private TestEnum(Strategy strategy) {
this.strategy = strategy;
}
/** Strategyへの委譲 */
public void exec() {
this.strategy.exec();
}
/** Strategyパターンのインターフェース */
static interface Strategy {
void exec();
}
}
このStrategyを受け取るメソッドはenumとして受け取るように作ります。
/** Strategyをenumで引き渡す */
public static void hoge(TestEnum strategy) {
strategy.exec();
}
このようにしておくとIDEの補完機能でメソッドに引き渡すenumの一覧が参照できます。
そもそも既定のenum以外は渡すことができません。
この手法はStrategyの種類が固定である場合、規定外のStrategyを作らせないという効果があります。
Strategyの種類を増やす場合にはenumの編集が必要になるので、自由な拡張ができないわけですが、
逆に自由に拡張させたくない場合に使うことができるわけです。
利用側はStrategyパターンなど理解していなくともフラグとしてenumを渡すだけでよいのです。
また、StrategyパターンというよりはStateパターンになりますが、この列挙の値そのものをフラグとして使う場合、
classのインスタンスを用いるよりも扱いが便利です。
このように静的な強い型付けを利用することで、クラスライブラリの利用者に誤った使い方をさせないように工夫することができます。
投稿日時 : 2008年5月20日 23:28