面向对象的洗礼:设计模式(十四)之观察者模式
观察者模式,又叫做订阅-发布模式。当一个对象的改变需要同时改变多个对象的时候,可以使用法不这模式。设计模式中的观察者模式,就是为了解除类之间的耦合,使双方都依赖于抽象而不是依赖于具体。在实际生活中,比如我们更换了手机号,需要通知大家的时候,我们就是主题,或者通知者,而需要通知的人就是观察者列表,一条短信的群发告诉大家,就是观察者模式的应用。
<?php //主题者、通知者抽象类。 abstract class Subject{ private $observerList = array(); public function add(&$obj, $action){ $this->observerList[] = array('obj'=>$obj, 'action'=>$action); } public function notice(){ foreach($this->observerList as $observer){ $obj = $observer['obj']; $action = $observer['action']; $obj->$action; } } } //具体的通知者 class I extends Subject{ private $status; public function getStatus(){ return $this->status; } public function setStatus($status){ $this->status = $status; } } //观者者抽象类 abstract class Observer{ public function sendSms(){ } } //具体的观察者 class ConcreteObserver extends Observer{ private $name; private $status; private $objSubject; public function __construct($name, $objSubject){ $this->name = $name; $this->objSubject = $objSubject; } public function sendSms(){ $status = $this->objSubject->getStatus(); echo '观察者'.$this->name.'收到的状态是'.$status.'<br>'; } } //客户端/接口 $i = new I(); $i->setStatus('更换手机号码了。'); $friend1 = new ConcreteObserver('小明', $i); $friend2 = new ConcreteObserver('小红', $i); $friend3 = new ConcreteObserver('小黄', $i); $i->add($friend1, 'sendSms'); $i->add($friend2, 'sendSms'); $i->add($friend3, 'sendSms'); $i->notice(); ?>