デザインパターン[Strategy]

本日連投です。

私にとってデザインパターンの中で一番印象深いのがこのパターンだ。
FF12ガンビットはこのパターンをふんだんに使用していることこの上ないと確信している(笑)

と、
Strategyとは戦略という意味だが、
まさにその通りのパターンだ。

ある特定のアルゴリズムを外だしにして、
柔軟に変更できるようするのがこのパターンの狙いだ。

登場するクラスを紹介する。
Strategyパターンを使用するクラス(Client)
Strategyインターフェイス(Strategy)
Strategyインターフェイス実装クラス(StrategyImpl)

Clientがパターンに入っているのは、このような使い方をしてこそStrategyパターンと呼べるということだ。
実装はCommandパターンとほぼ同じなので、「使用意図の違い」がパターンの違いになっていると考えて欲しい。

今回は気合を入れてガンビットのクラス図(適当)を書いてみた。
ガンビットクラス図 ミニ
クリックすると縮小前の画像が出ます。

StateCheckStrategyってやつがStrategyだ。
その状態に適合するキャラを返すアルゴリズムを外出しにしている。
ActionはCommandパターン。 さらには、NullCharactorってのもある。
こいつはNullObjectパターンと言って、
何もしないクラスの事だ。 詳しくはまた別の機会に。
StateCheckStrategyで該当するキャラがいなかった場合に返却している。
こうすることで、nullを返すことがなくなり、エレガントになる。
外側でもnullチェックなどは必要なくなり、随時返却されたキャラに対し、Actionを実行すればよい。

FF12がこのような実装になっているとは限らないし、
これでFF12と同じ実装ができ、動くか?といわれれば微妙なところである。
私はアジャイラーなので、分かる範囲で設計し、最低限の実装をしていくのに慣れてしまっている。 完全な設計などしたことないのだ。
あとは、問題が出ては設計を見直し、実装していく。 この繰り返しだ。
これが良いことかどうかは別として、これでなんとかやってこれているのは事実である。