设计模式这一概念最初源于建筑学,它的提出者克里斯托弗-亚历山大认为建筑设计要围绕以人为本的目的。建筑物要基于社会和人性来设计,程序设计亦是如此。
虽然简单套用模式并不能解决所有问题,但是模式这一理念对一些广泛的基础场景指出了最佳实践,是一种务实的分析和设计方法,是值得程序设计者学习和理解的,并时刻提醒设计者,设计模式的核心意义就是以人为本,设计要服务于人。
1994年,由四位面向对象领域专家合著出版了《设计模式:可复用面向对象软件的基础》,这本书中介绍了程序设计中常用的23中设计模式。这篇文章将介绍其中之一-观察者模式
模式简介
观察者模式是一种行为型模式,其核心是定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知并自动更新。
现实举例
1931年,时任英国政治家丘吉尔去美国纽约拜访友人,他下出租车后习惯性的先向右观察然后过马路,结果被左边开来的车撞倒受伤。当人们跑过去看他的伤情时,丘吉尔清醒过来并主动承担责任。英国是左侧通行,所以他过马路习惯先右看再左看,而美国则正好相反。肇事司机因此脱罪,此事经《纽约时报》报道后再当地成为一条引发热议的新闻。
我们过马路时都需要先看一下信号灯以及路上的车辆状况,此时每一个人都是观察者,需要按既定的规则观察信号状态,然后判断下一步的动作。
观察的结果和相应的动作是预定的,根据红绿灯状态和左右车辆情况决定是否可以通行。当被观察者交通灯发生变化时,所有相关的观察者们都会感知到交通灯状态的变化,从而采取对应的预定行动。
当一个对象的状态发生改变时,这个对象相关依赖的所有对象都可以得到通知并能够自动更新的行为模式就是观察者模式。
程序设计分析
当一个对象状态发生改变之后,应该如何向其他相关的对象发送变化的通知呢?
我们需要定义对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都可以得到通知并执行相关的动作。
解决方案
定义一个被观察者和多个观察者,并将这些观察者联系到相应的被观察者,当被观察者的状态发生改变时,调用方法逐一地通知观察者对象。
被观察者A为目标类,是一个抽象类。一个被观察者可以接受多个观察者的观察,并且可以再自己的内表中添加或者删除某个观察者。被观察者也定义了通知方法,用于通知每一个注册过的观察者。
抽象类A的子类A1,是真正被实例化的类,当状态发生改变时,该对象就向各个观察者发出通知。
接口B为观察者,声明了一个方法update,表明一旦接收到被观察者的状态发生改变后相应的逻辑就会更新。
类B1实现了观察者接口,并实现了接口中定义的update方法,定义了一旦接收到被观察者状态发生改变后,相应的逻辑更新。
具体观察者B1有多个实例,被观察者可以通过添加和删除观察者来管理对应的观察者记录。
观察者模式将观察者和被观察者解耦,被观察者可以按需要增加或者删除观察者,并能够将变化及时通知给所有相关的观察者。