标签:
观察者模式定义:定义对象间一种一对多的依赖关系,当这个对象状态发生变化时,则所有依赖它的对象都会得到通知并被自动更新(注:这里的依赖是一种聚合的方式)。 笔者对于这些定义什么的其实相当的不感冒,虽然这个写得的确很不错的样子。下面直接上代码运行效果图,通过将’男孩子们打望美女淋浴‘的例子,来讨论下该模式。
代码贴上:
<?php //被打望者接口 实现该接口的对象都可以视为实际被打望的妹子 interface IbeatifulGirl{ public function join(IBoy $boy); //添加打望者 public function goaway(IBoy $boy); //干掉打望者 public function notify(); //通知打望者 } //来了一个要被打望的漂亮妹子 class BeatifulGirl implements IbeatifulGirl{ private $boys; //定义打望者集合(这里的打望者有服了,妹子有消息都会受到通知。) function __construct() { $this->boys = array(); //初始化集合 } //添加打望者(不然怎么通知呢?) public function join(IBoy $boy){ if(!in_array($boy->name,array_keys($this->boys))){ $this->boys[$boy->name]=$boy; } } //干掉打望者(被妹子发现了,或者长太丑,不允许打望了。) public function goaway(IBoy $boy){ if(in_array($boy->name,array_keys($this->boys))){ unset($this->boys[$boy->name]); } } //通知打望者,告诉他们做好准备 public function notify(){ foreach ($this->boys as $boy){ $boy->update(); } } //被打望的漂亮妹子开始淋浴了 public function shower(){ echo ‘美女开始淋浴了<br/>‘; //通知所有的打望者 $this->notify(); } } //打望者接口 实现该接口的对象都可以视为实际去打望的人 interface IBoy{ public function update(); //收收到妹子的消息的时候,自己立马做准备,你懂的。 } //张三来打望来了 class Zhangsan implements IBoy{ public $name; function __construct($name) { $this->name = $name; } //张三收到通知的行为:可能是太远了,所以提前准备望远镜。 public function update(){ echo $this->name.‘received:准备望远镜,并开始打望。<br/>‘; } } //李四来打望来了 class Lisi implements IBoy{ public $name; function __construct($name) { $this->name = $name; } //李四收到通知的行为:难得有机会,得准备好照相机。 public function update(){ echo $this->name.‘received:准备照相机,并开始照相。<br/>‘; } } //王五来打望来了 class Wangwu implements IBoy{ public $name; function __construct($name) { $this->name = $name; } //王五收到通知的行为:哥来发个大招,摄影机记录下来得了。 public function update(){ echo $this->name.‘received:准备摄影机,并开始摄影。。<br/>‘; } } //浴室来了个妹子 $girl = new BeatifulGirl(); $girl->join(new Zhangsan(‘张三‘)); //张三要打望 $girl->join(new Lisi(‘李四‘)); //李四要打望 $girl->join(new Wangwu(‘王五‘)); //王五要打望 //美女开始淋浴 福利来了 !!! $girl->shower(); echo ‘皆大欢喜!我也是醉了!‘;
附上百度的观察者模式通用类图。文中淋浴的女孩就是具体被观察者,张三李四王五就是具体的观察者。
优点:对象之间松耦合,可以交互,不许知道彼此的细节。被观察者中可聚合多个观察者并全部发出通知,并不关心通知后观察者你要做什么,怎么做。(反正我开始淋浴了,随便你来不来围观),支持‘广播通信’,并符合‘开闭原则’要求。
缺点:如果被观察者有很多观察者,通知可能会话费很多时间;如果观察者和被观察者循环依赖的话,可能导致系统崩溃;一个观察者多个被观察者的情况下,可能导致通知响应时间长或者无响应。(这种情况可以考虑异步架构或者留充足资源做同步架构)
使用场合:如定义所言,当一个对象状态变化,会引起多方的状态变化的场景即可使用。
笔者第一次写博客,有点洋气的感觉。不过由于水平有限,如有问题,大家一起讨论。
联系方式:
姓名:24K纯屌丝
QQ:1418197673
Email:devenv@sina.cn
设计模式:观察者模式(发表-订阅(Publish/Subscribe)模式)
标签:
原文地址:http://www.cnblogs.com/24kcds/p/observer.html