ストラテジー パターン

Strategy Pattern

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();
      

出力結果


        私は本物のマガモです
        ガーガー
        飛んでいます!!

        模型のカモです
        ガーガー
        ロケットで飛んでいます!
      

だてめがね
...
©️ ponpocopy

とある企業で社内SEをしています。 自身の学びが誰かの為になれば、という想いで日々ブログを更新中。 PHP(CakePHP・Laravel・FuelPHP), Pyhotn(Django・Flask), C#(ASP.NET、Unity) が好きです。