Java : Strategyパターン
[id:w_o:20060611:p2]って、いわゆるStrategyパターンじゃない?とか思った。
まず、宇宙船クラス。
class SpaceShip { double x = 0.0; double y = 0.0; double idou_kyori_x() { ... } double idou_kyori_y() { ... } void move() { if (mover != null) { mover.move(this); } } Mover mover = null; interface Mover { void move(SpaceShip ship); } }
で、直進クラスは、
class LinearMover implements SpaceShip.Mover { public void move(SpaceShip ship) { ship.x += ship.idou_kyori_x(); ship.y += ship.idou_kyori_y(); } }
壁あり直進クラスは、
class KabeMover implements LinearMover { final double bound_x; final double bound_y; KabeMover(double bound_x, double bound_y) { this.bound_x = bound_x; this.bound_y = bound_y; } public void move(SpaceShip ship) { super.move(ship); if (ship.x < 0.0) { ship.x = 0.0 }else if (ship.x > bound_x) { ship.x = bound_x; } if (ship.y < 0.0) { ship.y = 0.0 }else if (ship.y > bound_y) { ship.y = bound_y; } } }
このパターンは、結構便利で、使いこなすと使いどころの多いパターンです。似たような構成で、ちょっとずつ違う動作をする画面をいくつも作らなければいけないようなときって少なくないですが、このパターンのバリエーションで考えると上手くまとめられることがあります。
ちなみに、こういうパターンって、id:m-hiyamaさんが気持ち悪いって言っている犬やら猫やらの概念の世界にいるとわけがわからないのですが、関数型言語の世界になじみのある人なら「クラス = 関数」と思って見直してみれば、関数型ではよくあるパターンだったりします。