Strategy パターン | デザインパターン
2022年9年20日
デザインパターン
Strategy
PHP
オライリージャパンによる Head First シリーズ デザインパターン(第2版)第1章 Strategy パターンを、 PHPで書き直してみようという試みです。
Duck.php
namespace Strategy; abstract class Duck { public $quackBehavior; public $flyBehavior; public function __construct(){ } public function performQuack() : void { $this->quackBehavior->quack(); } public function swim() : void { echo 'すべてのカモは浮きます。おとりのカモでも!' . "\n"; } abstract function display(); public function performFly() : void { $this->flyBehavior->fly(); } public function setQuackBehavior($cb) : void { $this->quackBehavior = $cb; } public function setFlyBehavior($fb) : void { $this->flyBehavior = $fb; } }
MallardDuck.php
namespace Strategy; use Strategy\Behavior\Quack; use Strategy\Behavior\FlyWithWings; class MallardDuck extends Duck { public function __construct(){ $this->quackBehavior = new Quack(); $this->flyBehavior = new FlyWithWings(); } public function display(){ echo '私は本物のマガモです' . "\n"; } }
ModelDuck.php
namespace Strategy; use Strategy\Behavior\Quack; use Strategy\Behavior\FLyNoWay; class ModelDuck extends Duck { public function __construct(){ $this->quackBehavior = new Quack(); $this->flyBehavior = new FLyNoWay(); } public function display(){ echo '模型のカモです' . "\n"; } }
QuackBehavior.php
namespace Strategy\Behavior; interface QuackBehavior { public function quack() : void; }
Quack.php
namespace Strategy\Behavior; class Quack implements QuackBehavior { public function quack() : void { echo 'ガーガー' . "\n"; } }
FlyBehavior.php
namespace Strategy\Behavior; interface FlyBehavior { public function fly() : void; }
FlyWithWings.php
namespace Strategy\Behavior; class FlyWithWings implements FlyBehavior { public function fly() : void { echo '飛んでいます!!' . "\n"; } }
FlyNoWay.php
namespace Strategy\Behavior; class FlyNoWay implements FlyBehavior { public function fly() : void { echo '飛べません' . "\n"; } }
FlyRocketPowered.php
namespace Strategy\Behavior; class FlyRocketPowered implements FlyBehavior { public function fly() : void { echo 'ロケットで飛んでいます!' . "\n"; } }
index.php
use Strategy\MallardDuck; use Strategy\ModelDuck; use Strategy\Behavior\FlyRocketPowered; $mallard = new MallardDuck(); $mallard->display(); $mallard->performQuack(); $mallard->performFly(); $model = new ModelDuck(); $model->display(); $model->performQuack(); $model->setFlyBehavior(new FlyRocketPowered()); $model->performFly();
出力結果
私は本物のマガモです ガーガー 飛んでいます!! 模型のカモです ガーガー ロケットで飛んでいます!