标签:
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动更新自己。
类结构图如下:
举个例子,有一个报警系统,监控到异常后需要报警给运维人员,那么运维人员是观察者,我也可以把老板添加到观察者里,让老板也收到这个报警(实事上老板是不会关心到这种鸡毛蒜皮的小事的~~)。
<?php //被观察者抽象类 abstract class AbstractSubject{ private $observers = array(); public function Attach($o){ $this->observers[] = $o; } public function Detach($o){ foreach($this->observers as $k=>$v){ if($v == $o){ unset($this->observers[$k]); break; } } } public function Notify($info){ foreach($this->observers as $v){ $v->Update($info); } } } //被观察者具体实现 class ConcreteSubject extends AbstractSubject{ public function baojing($str){ $this->Notify($str); } } //抽象观察者类 abstract class AbstractObserver{ abstract public function Update($info); } //观察者具体类1 class ConcreteObserver extends AbstractObserver{ public function Update($info){ echo "检测到 ".$info; } } //观察者具体类2 class laoban extends AbstractObserver{ public function Update($info){ echo "老板,".$info; } } //场景类 class Client{ public function run(){ $subject = new ConcreteSubject; $observer = new ConcreteObserver; $subject->Attach($observer); $laoban = new laoban; $subject->Attach($laoban); //$subject->Detach($laoban); $subject->baojing("啦啦啦 内存快撑暴啦!\n"); } } Client::run();
标签:
原文地址:http://www.cnblogs.com/zhutianpeng/p/4234288.html