文章目录
- 1 观察者模式介绍
- 2 观察者模式详解
-
- 2.1 观察者模式结构
- 2.2 观察者模式实现
- 2.3 观察者模式应用举例
- 3 观察者模式与MVC
1 观察者模式介绍
“红灯停,绿灯行”。在这个过程中,交通信 灯是汽车的观察目标,而汽车则是观察者。随着交通信 灯的变化,汽车的行为也随之变化,一盏交通信 灯可以指挥多辆汽车。
由图可知,观察者模式包含以下4个角色。
- Subject(目标):目标又称为主题,它是指被观察的对象。在目标中定义了一个观察者集合,一个观察目标可以接受任意数量的观察者来观察,它提供了一系列方法来增加和删除观察者对象,同时它定义了通知方法notify()。目标类可以是接口,也可以是抽象类或具体类。
- ConcreteSubject(具体目标):具体目标是目标类的子类,它通常包含有经常发生改变的数据,当它的状态发生改变时它向各个观察者发出通知;同时它还实现了在目标类中定义的抽象业务逻辑方法。如果无须扩展目标类,具体目标类可以省略。
- Observer(观察者):观察者将对观察目标的改变做出反映,观察者一般定义为接口,该接口声明了更新数据的方法update(),因此又称为抽象观察者。
- ConcreteObserver(具体观察者):在具体观察者中维护一个指向具体目标对象的引用,它存储具体观察者的有关状态,这些状态需要和具体目标的状态保持一致;它实现了在抽象观察者Observer中定义的update()方法。通常在实现时可以调用具体目标类的attach()方法将自己添加到目标类的集合中或者通过detach()方法将自己从目标类的集合中删除。
2.2 观察者模式实现
抽象目标类典型代码如下:
具体目标类典型代码如下:
抽象观察者典型代码如下:
具体观察者典型代码如下:
- 有时候在具体观察者类ConcreteObserver中需要使用到具体目标类ConcreteSubject中的状态(属性),会存在关联或依赖关系。
- 如果在具体层之间具有关联关系,系统的扩展性将受到一定的影响,增加新的具体目标类有时候需要修改原有观察者的代码,在一定程度上违背了开闭原则,但是如果原有观察者类无须关联新增的具体目标,则系统扩展性不受影响。
2.3 观察者模式应用举例
-
题目描述
在某多人联机对战游戏中,多个玩家可以加入同一战队组成联盟,当战队中的某一成员受到敌人攻击时将给所有其他盟友发送通知,盟友收到通知后将做出响应。现使用观察者模式设计并实现该过程,以实现战队成员之间的联动。
-
题目分析
战队成员之间的联动过程:联盟成员受到攻击——>发送通知给盟友——>盟友做出响应。
其中,AllyControlCenter充当抽象目标类,ConcreteAllyControlCenter充当具体目标类,Observer充当抽象观察者,Player充当具体观察者。
-
代码
代码地址
3 观察者模式与MVC
在当前流行的MVC(Model-View-Controller)架构中也应用了观察者模式,MVC是一种架构模式,它包含了3个角色,即模型(Model),视图(View)和控制器(Controller)。其中,模型可对应于观察者模式中的观察目标,而视图对应于观察者,控制器可充当两者之间的中介者。当模型层的数据发生改变时,视图层将自动改变其显示内容。MVC的结构图如下:

文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览92605 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!