デザインパターンを覚えたい (Strategy)

Strategyパターン

具体的な実装クラスを差し替えることで戦略、つまり動作の切り替えを行うパターン。
クラスの構成的にはBridgeとすごく似てて、

  • 切り替える動作のメソッド定義をしたStrategyインターフェース
  • 実際の動作を定義したConcreteStrategyクラス
  • 外部から参照されてStrategyのインスタンスを属性に持つContextクラス

で構成される。Bridgeと何が違うんだって感じだけど、調べるとStrategyインターフェースの部分がBridgeだと抽象クラスらしい。
# どっちでもよくね?とか思っちゃうあたり自分は理解が足りないのかもね

実装。C++だとインターフェースな感じにならなそうなのと、Javaやりたい気分なので今回はJava使う。
戦略ってことなので題材は囚人のジレンマにします。
http://dl.dropbox.com/u/7810000/code/design_pattern/strategy.zip

実行方法と結果は以下のとおり。ビルドにはantを使ってます。

$ unzip strategy.zip
$ cd strategy
$ ant test
もしくは
$ java -classpath classes Main
result: RandomStrategy = 377 months, TitForTatStrategy = 389 months

ちなみに、対戦させてるのはランダム戦略としっぺ返し戦略。
# しっぺ返し戦略が妙に成績悪いのが気になるけど、ランダム相手だとそういうもんなんだっけか

実装自体はBridgeパターンとあまり変わってない。ポイントはPlayerクラスで戦略を切り替えているところ。

public class Player {
    // プレーヤが従う戦略
    private Strategy strategy;

    public Player(Strategy strategy) {
        this.strategy = strategy;
    }

    public Select next(Select preOpponentSelect) {
        // 選択はStrategyの実装クラスにお任せする
        return strategy.decideSelect(preOpponentSelect);
    }
}