前言
文章内容主要参考了刘伟主编的《设计模式(第2版)》,同时也结合了自己的一些思考和理解,希望能帮到大家。
本篇讲解观察者模式,和中介者模式有相像之处。
在某些场景中,需要建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应。在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展,这就是观察者模式的模式动机。
一个目标可以有任意数目的与之相依赖的观察者,一旦目标的状态发生改变,所有的观察者都将得到通知。
作为对这个通知的响应,每个观察者都将即时更新自己的状态,以与目标状态同步,这种交互也称为发布-订阅(publish-subscribe)。目标是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅它并接收通知
正文
一、定义
观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。观察者模式是一种对象行为型模式。
那么问题就是如何去让所有的观察者一直监视被观察者的动态呢?其实这里看似观察者具有很大的主动权,但主动权在被观察者手上,即当被观察者需要做出改变时,自己需要手动的通知所有人,而不单单是改变自己罢了。
这时被观察者首先自身有个容器装下所有的观察者,当需要让观察者“看到变化”时,就遍历所有的观察者,并调用观察者自身该有的响应方法。
和中介模式相近的就是都有个容器装下所有的对象,不过中介者模式是多对多的,容器的作用仅是沟通,而自身并不算得上一个“真正的实体”,但观察者模式无论观察者和被观察者都是“真正的实体”。
二、情景假设
假设猫是老鼠和狗的观察目标,老鼠和狗是观察者,猫叫老鼠跑,狗也跟着叫,使用观察者模式描述该过程。
三、情景分析
关于上面情景的类图(具体分析在下面)
左边的就是被观察者,有一个ArrayList容器装下所有的观察者,观察者在右边。
抽象目标类MySubject
public abstract class MySubject {
protected ArrayList observers = new ArrayList<>();
//注册方法
public void attach(MyObserver</