検証



<?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>';
?>

出力

ワン ワン
キーキー
ニャオーン