isseium's blog

田舎に住むWebエンジニアのブログ

PHPでデザインパターン 〜Strategy パターン〜

Strategy パターン

一連のアルゴリズムを定義し、それぞれをカプセル化してそれらを交換可能にする。
これによって、アルゴリズムを使用するクライアントとは独立して、アルゴリズムを変更できる

パターン適用前

鳥が複数いるとします。飛び方や鳴き方は、すべての鳥で共通ではありませんが、ある鳥同士は共通であったりします。

http://gyazo.com/44517dd494cf25cc9302d30fc26614df.png

パターン適用後

http://gyazo.com/c1b99ac45c7d025812b4fb240a323a5d.png

コード

<?php
abstract class Bird {
        protected $name;
        protected $fly;
        protected $sing;

        public function __construct(){
        }

        public function fly(){
                $this->fly->fly();
        }

        public function sing(){
                $this->sing->sing();
        }

        public function status(){
                echo $this->name .  " の状態:\n";
                $this->fly();
                $this->sing();
        }
}

interface Fly {
        public function fly();
}

class FlySlowly implements Fly {
        public function fly(){
                echo "ゆっくり飛んでいます\n";
        }
}

class FlyFast implements Fly {
        public function fly(){
                echo "速く飛んでいます\n";
        }
}

interface Sing {
        public function sing();
}

class SingLoud implements Sing{
        public function sing(){
                echo "うるさく鳴いています\n";
        }
}

class SingSilently implements Sing{
        public function sing(){
                echo "鳴いていません\n";
        }
}

class Crow extends Bird {
        public function __construct(){
                $this->fly = new FlyFast();
                $this->sing = new SingLoud();
                $this->name = "カラス";
        }
}

class Robin extends Bird {
        public function __construct(){
                $this->fly = new FlySlowly();
                $this->sing = new SingSilently();
                $this->name = "こまどり";
        }
}

class Pigeon extends Bird {
        public function __construct(){
                $this->fly = new FlySlowly();
                $this->sing = new SingLoud();
                $this->name = "";
        }
}


$crow = new Crow();
$robin = new Robin();
$pigeon = new Pigeon();

$crow->status();
$robin->status();
$pigeon->status();