首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

每天一记之观察者模式

2013-10-25 
每日一记之观察者模式定义: 在一对多依赖的对象关系中, 如果这个一对象状态发生了变化,那么它所有依赖的

每日一记之观察者模式

定义: 在一对多依赖的对象关系中, 如果这个'一'对象状态发生了变化,那么它所有依赖的'多'对象都应该被通知,然后做相应的变化

在观察者模式中最重要的俩个对象分别是:Observable(被观察者)和Observer(观察者)对象.它们的关系可总结如下:

1. 被观察者和观察者对象是一对多的关系,也就是说一旦被观察者对象状态变化,它就要负责通知所有和它有关系的观察者对象,然后做相应的改变.

2. 在被观察者中有一个集合和一个状态控制开关,所有注册了通知的观察者对象会被保存在这个集合中.这个控制开关就是用来控制被观察者是否发生了变化,一旦发生了变化,就通知所有的观察者对象更新状态.


我们看一场景:现在有一用户模块,我们需要监听用户的行为,比如说当用户发表了某一动态, 怎么能让其他跟用户有关的模块及时的更新信息呢。这里我们就可以使用观察者模式,先看看观察者模式的UML类图:

每天一记之观察者模式

通过UML 类图我们可以看到,如果要实现观察者模式,首先需要定义两个接口,一个被观察者接口,一个观察者接口。然后在具体的被观察者类中应该提供3个方法,添加观察者attach(),移除观察者detach(). 而在观察者类中则需要实现一个update()方法,用于当被观察者发生改变时所需要做出的反应。


具体的代码实现如下:

//被观察者

//实例化被观察者$subject = new Subject();//分别实例化两个观察者$observer1 = new Observer1();$observer2 = new Observer2();//将被观察者加入观察行列$subject->attach($observer1);$subject->attach($observer2);//当被观察者发生某些改变时,观察者应该被通知到$subject->upload();

在上面的代码中,如果被观察者执行了upload方法的时候,将会通知所有的观察者,我们上传了一个头像。然后观察者可根据自己的情况实现相应逻辑。


观察模式一般用户插件的实现方式,因为一般在开发一个系统的插件的时候,我们不希望去改变系统的源码。这要就需要系统能力对外扩展。

热点排行