java学习脚印: 设计模式之观察者模式(Observer)
1.设计模式定义
观察者模式又称为发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主体对象。这个主题对象主题在状态发生变化时,会通知所有的观察者对象,使他们能够自动更新自己。
2.设计模式实例
观察者模式是我们不陌生的模式,尤其在MVC(模型(model)-视图(view)-控制器(controller)框架模式)中,模型与视图就是一种典型的目标对象与观察者关系,一个Model可能会对应两个以上的View。
在GUI开发中,Swing中的事件模型,也是一种观察者模式,常常是通过AddxxxListener()来添加观察者,然后内部通过fireActionPerformed(ActionEvent event)方法来调用观察者的actionPerformed()方法来通知观察者的。
eg1: 文本编辑软件,每次修改文本内容,后状态栏,菜单栏都会发生相应的变化,这里文档Document对象就是目标对象,状态栏、菜单栏等就是观察者。
eg2: 角色扮演游戏中,玩家操作所扮演的角色对象后,该角色对象的状态会及时反映到主窗体主中例如体力值、攻击力,同时还有分数提醒、背景音乐的变化等都得围绕游戏角色的状态来作出调整。此时游戏角色就被作为目标对象,而其他的显示、音效等就是观察者。
3.观察者模式的类间关系
定义了Subject和Observer接口,让具体类实现这些接口,这样来降低主题对象和观察者之间类设计的耦合性。
4.观察者模式的优缺点及应用场合
4.1观察者模式优缺点
优点 : 观察者模式让系统中的主题对象和观察者之间实现了一对多的依赖关系,Subject发布通知时不需要直到具体Observer是谁,而任何一个Observer也不需要直到其他Observer的存在。这样各个类之间耦合性降低,给维护和拓展带来方便。
缺点: 观察者模式也存在一定不足,比如在现实开发中,某些类已经设计完成,而它没有实现Observer中表明的接口方法,那么就需要作出改动,带来不便。.Net中有事件委托机制,在java中也可以通过EventHandler和反射机制来实现委托,可参见:laotou99 的博客 JAVA事件委托。
4.2观察者模式应用
观察者模式,通常用在当一个对象的改变需要同时引起很多其他对象的改变,而且它不知道具体有多少个对象待改变时的这种情况。
5.案例代码
这里选择一个区分[0,100]类整数的程序,程序通过观察产生数字的主题对象,每当产生数字时就由四个观察者判断数字是否为奇数、偶数、质数、合数中的一种。
类图如下类图所示:
程序运行结果如下图所示:
程序清单如下:
观察者接口和类
package com.learningjava;
import java.awt.Font;
import javax.swing.*;
/**
* Observer interface