Strategy(戦略)、つまりプログラムならアルゴリズムを切り替える。
これは分かりやすい。ゲームに例えるなら、CPUと対戦するゲームを作った場合、CPUのクラスに思考ルーチンを組み込んでしまうのではなく、思考ルーチンを別クラスにして定義し、CPUのクラスは委譲して使う。こうすればいろんな思考ルーチンを用意して切り替えることができる。
class Strategy { public: int Action(); void setResult(int result); }; class Cpu { private: Strategy strategy; public: // CPUの行動 void doTurn() { int action = strategy.Action(); doAction(action); } // 敵の行動結果 void setResult(int result) { strategy.setResult(result); } }; // 具体的な戦略 class StrategyA : public Strategy { public: int Action() { int action; // 行動を選択 ... return action; } void setResult(int result) { // 相手の行動結果を受け、内部情報更新 ... } };
ここではStrategyクラスのAction()で次の行動を取得し、setResult()で敵側の行動結果をStrategyへ反映させる。Strategyの具体的な実装クラスであるStrategyAではAction()とsetResult()を実装している。なんらかのパラメータを持って、そのパラメータにより行動を選択したり、相手の行動結果によりパラメータを更新したりする。
こうやって戦略のアルゴリズム部分を分離することにより、いろんなアルゴリズムを追加したり、実行中に切り替えたりすることができる。
※ソースはイメージを表したもので、実際にはこのまま入力しても動作しない。
参考文献:Java言語で学ぶデザインパターン入門
参考:ギコ猫とStrategyパターン