观察者模式
对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
![](https://images2015.cnblogs.com/blog/1187373/201706/1187373-20170626171749789-575794283.jpg)
看不懂图的人端着小板凳到这里来,给你举个例子:假设有三个人,小美(女,28),老王和老李。小美很漂亮,很风骚,老王和老李是两个中年男屌丝,时刻关注着小美的一举一动。
有一天,小美说了一句:我老公今天不在家,一个人好无聊啊~~~,这句话被老王和老李听到了,结果乐坏了,
蹭蹭蹭,没一会儿,老王就冲到小美家门口了,于是进门了……………………..帕~啪啪啪啪啪~
在这里,小美是被观察者,老王和老李是观察者,被观察者发出一条信息,然后观察者们进行相应的处理,看代码:
interface Person{ //老王和老李通过这个接口可以接收到小美发过来的消息 public function getMessage($s); }
这个接口相当于老王和老李的电话号码,小美发送通知的时候就会拨打getMessage这个电话,拨打电话就是调用接口,看不懂没关系,先往下看
class LaoWang implements Person{ private $name='老王'; public function getMessage($s) { echo $this->name.'接到了小美打过来的电话,电话内容是:'.$s."<br />"; } } class LaoLi implements Person{ private $name='老李'; public function getMessage($s) { echo $this->name.'接到了小美打过来的电话,电话内容是:'.$s; } }
代码很简单,我们再看看小美的代码:
class XiaoMei{ private $_observers = array(); public function addPerson($sub){ $this->_observers[] = $sub; } public function notifyPerson(){ if(!empty($this->_observers)){ //遍历$_observers,把自己的通知发送给所有暗恋自己的人 foreach($this->_observers as $observer){ $observer->getMessage('今天家里就我一个人,你们过来吧,谁先过来谁就能得到我!'); } } } }
我们写一个测试类来看一下结果对不对
/** * Class Test 编写测试类 */ class Test{ public function main() { $LaoWang=new LaoWang(); $LaoLi=new LaoLi(); $XiaoMei=new XiaoMei(); //老王和老李在小美那里都注册了一下 $XiaoMei->addPerson($LaoWang); $XiaoMei->addPerson($LaoLi); //小美向老王和老李发送通知 $XiaoMei->notifyPerson(); } }
ok完成。
总结
当新对象要填入的时候,只需要在主题(又叫可观察者)中进行注册(注册方式很多,你也可以在构造的时候,或者框架访问的接口中进行注册),然后实现代码直接在新对象的接口中进行。这降低了主题对象和观察者对象的耦合度。