观察者模式
//被观察者
interface Isubject{
function attach(Iobserver $observer);
function detach();
function notify();
}
//观察者
interface Iobserver{
function change(Isubject $subject);
}
class subject implements Isubject{
protected $observers;
protected $value;
function attach(Iobserver $observer){
$this->observers[] = $observer;
}
function detach(){
}
/**
通知 所有观察者
*/
function notify(){
foreach($this->observers as $observer){
$observer->change($this);
}
}
function setvalue($value){
$this->value = $value;
$this->notify();
}
function getvalue(){
return $this->value;
}
}
class observer implements Iobserver{
function change(Isubject $subject){
echo '被观察者 行动了:'.$subject->getvalue().'<br>';
}
}
$subject = new subject();//被观察者
$observer = new observer();//观察者x
$subject->attach($observer);//被观察者先要注册观察者(即 有哪些观察者?)
$subject->setvalue(5);//被观察者行动了(设置值为5),notify()方法通知观察者change()
/*
有这样的需求:
订单状态更新时 (被观察者 订单状态类,需封装)
更新用户积分 (观察者 积分类) changeOrderStatus();//订单状态更新时
更新商品库存 (观察者 商品类)
......
方法:
需封装,由于有多个地方可能更改订单状态类(前台用户或后台管理员等),
所以,实例化订单状态类时就注册好所有观察者(构造函数)
*/