十六. 观察者模式 (发布-订阅模式)
整理自 《java与模式》阎宏编著
1.意图:
定义对象间的一种一对多的依赖关系,当一个主题对象的状态发生改变时, 所有监听它的观察者对象都得到通知并被自动更新。
2.类图:
3.原理:
主题对象并不知道引用了哪些具体观察者对象类型,而只知道抽象观察者类型,这样具体主题对象可以动态地维护一系列的观察者对象的引用,并在需要的时候调用每一个观察者共有的更新方法。这是“针对接口编程”的体现。
4.特征:
抽象主题(Subject)角色:保存所有的观察者对象的引用到一个聚集里(如Vector),并提供注册或移除观察者的操作。一般用一个抽象类或一个接口实现。也称被观察者或发布者。
抽象观察者(Observer)角色:为具体观察者定义一个更新接口,更新接口中包含了更新的方法,在得到主题的通知时更新自己。一般用一个抽象类或一个接口实现。也称监听者或订阅者。
具体主题(ConcreteSubject)角色:实现抽象主题,在内部状态发生变化时,给所有注册的观察者发出通知。
具体观察者(ConcreteObserver)角色:实现抽象观察者角色所定义的更新方法, 在得到主题的通知时更新自己的状态。如有需要,具体观察者可以保存一个指向具体主题对象的引用。
5.说明:
6.使用案例:
Java.util.Observer 和 java.util.Observable
AWT事件模型,SAX2浏览器。
7.代码:
//Subject.java 抽象主题(Subject)角色
public class Subject
{
//保存所有注册的观察者对像的引用。
private ArrayList observers = new ArrayList();
//注册观察者
public void attach(Observer observer)
{
observers.add(observer);
}
//删除已注册的观察者
public void detach(Observer observer)
{
observers.remove(observer);
}
//通知所有的观察者
public void notifyObservers()
{
Iterator it = observers.iterator();
while (it.hasNext())
{
((Observer) it.next()).update(this);
}
}
}
// ConcreteSubject.java 具体主题(ConcreteSubject)角色
public class ConcreteSubject extends Subject
{
private String state;
//状态发生改变时通知所有的观察者
public void change(String newState)
{
this.state = newState;
notifyObservers();
}
public String getState()
{
return state;
}
}
// Observer.java抽象观察者(Observer)角色
public interface Observer
{
void update(Subject subject);
}
// ConcreteObserver.java具体观察者(ConcreteObserver)角色
public class ConcreteObserver implements Observer
{
public void update(Subject subject)
{
//put your code here
}
}
分享到:
相关推荐
键盘上每个键作用!!! (史上最全的) F1帮助 F2改名 F3搜索 F4地址 F5刷新 F6切换 F10菜单 CTRL+A全选 CTRL+C复制 CTRL+X剪切 ...用QQ邮箱阅读空间订阅涛哥 什么是阅读空间?
Extortion and Cooperation in the ZeroÂ-Day Market.pdf
做过 iOS 的同学应该都了解过 KVO,是观察者模式在 ObjectiveC 中的应用。使用 KVO,能很方便的实现对对象属 性的监听,参见探索KVC/KVO的实现原理KVC 一 和 探索KVC/KVO的实现原理KVO 二 虽然 iOS 提供了对...
目 录 一. 项目基本情况...九. 项目结论21
藏经阁-Improving HBase reliability at Pinterest with geo-‐replicat
摘要视图订阅登录 | 注册133987次千里之外26篇14篇1篇23条dataTables使用详细说明整理 行百里者半九十 博客频道 CSDN.N
Building Large--Scale Storage Systems: Practices and Experiences
INE, CAN, AND LIN 说明书(英文).pdf
8:50---9:00试音时间 9:00---9:10播放考场指令,发放作文考卷 9:10取下耳机,开始作文考试 9:35发放含有快速阅读的试题册(但9:40才允许开始做) 9:40---9:55做快速阅读 9:55-...
Radware AppDirector SIP Solution Guide
适用人群:ESP32WROOM32UE使用者
首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作。 以下我们就分别来看看这两个类:
python_2_郭倩男_20190415471
SIMATIC NET S7-300 400 - 工业以太网 PROFINET 组态和调试用于工业以太网的 S7CP
➥K / L ->降档/升档(仅在手动模式下) ➥ M -> 退出比赛 此后仍有作品或有趣游戏,可以进行学习与借鉴。请关注作者,且点赞加收藏,记得推荐好友。下载即可游玩,快来下载吧!五星好评可以私信我,免费送...
跨境环境下第三方支付的发展机遇与挑战研究以PayPal为例.docx
老司机Xavier Amatriain的分享引起了我的兴趣:Lessons Learned from Building Real-Life Recommender Systems。主要分享了作为推荐系统老司机的他,多年开车后总结的禁忌和最佳实践,这样的采坑实录显然是很有...
Win10 USBtoserial串口驱动(Prolific USB to Serial Comm Port),如果你的Win10认不到usb设备,就用它搞定 1、先安装windows 7_10_32_64,看是否成功,若不成功继续第二步; 2、进行YH340,先安装CH341...
台湾大学林轩田机器学习技法课程学习笔记1 Linear Support Vector Machine
01 产品的独立与统一 02 防御的独立与统一 03 数据的独立与统一