デザインパターンを覚えたい (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); } }