觀察者模式
/**
* 定義觀察接口
*/
interface Subject
{
public function Attach($Observer); //添加觀察者
public function Detach ($Observer); //踢出觀察者
public function Notify(); //滿足條件時通知觀察者
public function SubjectState($Subject); //觀察條件
}
/**
* 觀察類的具體實 現
*/
class Boss Implements Subject
{
public $_action;
private $_Observer;
public function Attach($Observer)
{
$this->_Observer[] = $Observer;
}
public function Detach ($Observer)
{
$ObserverKey = array_search($Observer, $this- >_Observer);
if($ObserverKey !== false)
{
unset($this->_Observer[$ObserverKey]);
}
}
public function Notify()
{
foreach($this->_Observer as $value )
{
$value->Update();
}
}
public function SubjectState($Subject)
{
$this->_action = $Subject;
}
}
/**
* 抽象觀察者
*
*/
abstract class Observer
{
protected $_UserName;
protected $_Sub;
public function __construct($Name,$Sub)
{
$this->_UserName = $Name;
$this->_Sub = $Sub;
}
public abstract function Update(); //接收通過方法
}
/**
* 觀察者
*/
class StockObserver extends Observer
{
public function __construct($name,$sub)
{
parent::__construct($name,$sub);
}
public function Update()
{
echo $this->_Sub->_action.$this->_UserName." 你趕快 跑...";
}
}
$huhansan = new Boss(); //被觀察者
$gongshil = new StockObserver("三毛",$huhansan); //初始化觀察者
$huhansan->Attach ($gongshil); //添加一個觀察者
$huhansan->Attach($gongshil); //添加一個相同的觀察者
$huhansan->Detach($gongshil); //踢出基中一個觀察者
$huhansan- >SubjectState("警察來了"); //達到滿足的條件
$huhansan->Notify(); //通 過所有有效的觀察者
策略模式
/**
* 定義支持算法的接口
*
*/
abstract class Strategy
{
abstract public function AlgorithmInterface();
}
class ConcreateStratA extends Strategy
{
public function AlgorithmInterface()
{
echo "算法A";
}
}
class ConcreateStratB extends Strategy
{
public function AlgorithmInterface()
{
echo "算法B";
}
}
class ConcreateStratC extends Strategy
{
public function AlgorithmInterface()
{
echo "算法C";
}
}
class Context
{
private $_StrObj;
public function __construct($strobj)
{
$this->_StrObj = $strobj;
}
public function ContextInterface()
{
$this->_StrObj- >AlgorithmInterface();
}
}
$context = new Context(new ConcreateStratA);
$context->ContextInterface();
$context = new Context(new ConcreateStratC);
$context->ContextInterface();
$context = new Context(new ConcreateStratB);
$context->ContextInterface();