每日一记之观察者模式
定义: 在一对多依赖的对象关系中, 如果这个'一'对象状态发生了变化,那么它所有依赖的'多'对象都应该被通知,然后做相应的变化
在观察者模式中最重要的俩个对象分别是: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();
观察模式一般用户插件的实现方式,因为一般在开发一个系统的插件的时候,我们不希望去改变系统的源码。这要就需要系统能力对外扩展。