あるStateパターンの実装について
Graphics.moveTo(), Graphics.lineTo()の切り替えを、if分を使わずにStateパターンを使って実装するという話。
この二つの切り替えは確かに面倒なので、ここでStateパターンの使いどころとしてなるほど便利だなー、と思った。
しかし、この実装の仕方はちょっとおかしい。
IStateクラスというインターフェイスクラスを作り、それをMoveToStateクラスでimplements、そのMoveToStateクラスを派生させてLineToStateクラスでしているのだ。
なぜ派生させているのかというと、LineDrawerという管理クラスへの参照を持つために、純粋にメソッドだけ定義することができないからだ。その結果、MoveToState, LineToStateが同等でないクラス構成になり、とても気持ち悪く感じる。私は、Stateパターンでは、それぞれのStateがなるべく同等であるべきだと思うのです(もちろん例外はある)。
私が実装するなら
で、この実装の場合には基底クラスを作るべきだ、と思うのです。
つまり、以下のような基底クラスLineDrawBaseを作り、これをMoveToStateクラス、LineToStateクラスへと派生させればいいのだ。
public class LineDrawBase{ protected var _drawer:LineDrawer; public function LineDrawBase( drawer:LineDrawer ){ _drawer = drawer; } public function draw( x:Number, y:Number ) :void{ // 派生クラスでoverrideする. } }