PHP设计模式(十四)之PHP实现观察者模式理论详细记录理论篇

作者: 温新

分类: 【设计模式】

阅读: 2429

时间: 2020-05-01 15:52:07

一、什么是观察者模式

观察者模式(Observer)是对象的行为模式,

1)观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象(Subject);

2)当一个主题对象状态改变时,会通知所有观察者对象(Observer),使得观察者对象能够自动更新自己的状态。

生活举例

举一个上课的例子。

当我们还在校园时代时,总是喜欢玩,上课玩、下课也玩。上课玩,最怕的就是老师了。

上课时间到了,但是老师还是没有到教室,这时候教室里总是闹哄哄的,想要玩的high但又不让老师发现,该如何是好?

聪明的同学们想到了一个办法,就是选出一个同学(如A同学)到教室门口监视老师有没有来,

而所有的同学都去关注A同学,当A同学发现老师来正在来的路上时,

就对所有关注他的同学发出一个通知,“如老师来了”,通知发出后,所有关注A的同学立马就收到了来自A同学的通知,

最后拿出课本假装在读书。

关于观察者模式,生活中有非常多的例子,就不多写。观察者模式实现代码根据上例进行编写。

二、观察者模式结构

抽象主题(Subject):主题是一个接口,该接口规定了具体主题需要实现的方法,如,添加、删除观察者以及通知观察者更新数据的方法。

抽象观察者(Observer):观察者是一个接口,该接口规定了具体观察者用来更新数据的方法。

具体主题(ConcreteSubject):具体主题是实现主题接口类的一个实例,该实例包含有可以经常发生变化的数据。

具体观察者(ConcreteObserver):具体观察者是实现观察者接口类的一个实例。具体观察者包含有可以存放具体主题引用的主题接口变量,以便具体观察者让具体主题将自己的引用添加到具体主题的集合中,使自己成为它的观察者,或让这个具体主题将自己从具体主题的集合中删除,使自己不再是它的观察者。

细解:

Subject类,把所有对观察者对象的引用保存在一个聚集中,每个主机都可以有任何数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象 。

Observer类,抽象观察者,为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。

ConcreteSubject类,将有关状态存入具体观察者对象,当具体主题内部状态发发生改变时,给所有登记过的观察者对象发出通知。

ConcreteObserver类,实现抽象观察者角色所要求的更新接口,使本身的状态与主题状态相协调

三、观察者模式使用场景

1)当一个对象的数据更新时需要通知其他对象,但这个对象又不希望和被通知的那些对象形成紧耦合

2)当一个对象的数据更新时,这个对象需要让其他对象也各自更新自己的数据,但这个对象不知道具体有多少对象需要更新数据

四、代码实现

PHP设计模式(十四)之PHP详细记录实现观察者模式代码篇

我是夕阳何处寻,期待和优秀的你一起同行!

夕阳何处寻

2020年05月01日

请登录后再评论