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();
出力結果
私は本物のマガモです
ガーガー
飛んでいます!!
模型のカモです
ガーガー
ロケットで飛んでいます!