<?php
class Animal{
private $barkStrategy;
public function __construct($mode='neko'){
// 下記のストラテジー変更は一例に過ぎない。ストラテジーを変更する方法はいろいろある。
$barkStrategy = new CatStrategy();
if($mode == 'inu'){
$this->setStrategy(new DogStrategy());
}else if($mode=='buta'){
$this->setStrategy(new PigStrategy());
}else{
$this->setStrategy(new CatStrategy());
}
}
public function setStrategy(IBarkStrategy $barkStrategy){
$this->barkStrategy = $barkStrategy;
}
public function bark(){
$this->barkStrategy->bark();
}
}
interface IBarkStrategy{
public function bark();
}
class CatStrategy implements IBarkStrategy{
public function bark(){
echo 'ニャオーン';
}
}
class DogStrategy implements IBarkStrategy{
public function bark(){
echo 'ワン ワン';
}
}
class PigStrategy implements IBarkStrategy{
public function bark(){
echo 'キーキー';
}
}
$animal = new Animal('inu');
$animal->bark(); // → ワン ワン
echo '<br>';
$animal->setStrategy(new PigStrategy());
$animal->bark(); // → キーキー
echo '<br>';
$animal->setStrategy(new CatStrategy());
$animal->bark(); // → ニャオーン
echo '<br>';
?>
出力
ワン ワン