十六. 观察者模式 (发布-订阅模式)
整理自 《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
}
}
分享到:
相关推荐
ESP32S3WROOM1ESP32S3WROOM1U技术规格书中文版2.4 GHz WiFi (802.11 b/g/n) + Bluetooth 5 (LE) 模组内置 ESP32S3 系列芯片,Xtensa 双核 32 位 LX7 处理器Flash 最大可选 16 MB,PSRAM 最大可选 8 ...
Extortion and Cooperation in the ZeroÂ-Day Market.pdf
做过 iOS 的同学应该都了解过 KVO,是观察者模式在 ObjectiveC 中的应用。使用 KVO,能很方便的实现对对象属 性的监听,参见探索KVC/KVO的实现原理KVC 一 和 探索KVC/KVO的实现原理KVO 二 虽然 iOS 提供了对...
数据手册:ESP32-C3 /ESP32-D0WD-V3/模组ESP32WROOM32E.pdf
- **数据速率确定**:主控设备根据模式识别比特率,并发送一个反转的高字节回声;ECU再发送一个反转的目的地址作为回应。 **初始化过程示例**: 1. 主控设备发送目的地址。 2. ECU响应“0x55”、低字节关键词和高...
同时,订阅服务模式和主动推送的防御策略将成为提升安全防御效率和响应速度的新趋势。 综上所述,文件中提到的“安全大棋局 - 独立与统一”强调了在网络安全领域,如何通过产品、防御、数据的独立与统一来构建一个...
➥K / L ->降档/升档(仅在手动模式下) ➥ M -> 退出比赛 此后仍有作品或有趣游戏,可以进行学习与借鉴。请关注作者,且点赞加收藏,记得推荐好友。下载即可游玩,快来下载吧!五星好评可以私信我,免费送...
ä¸å ´é¡¹ç®ç»-XXX-转æ£ç³è¯·è¡¨(1).doc
跨境环境下第三方支付的发展机遇与挑战研究以PayPal为例 在全球经济和科技日益发展完善的背景下,国际贸易朝着中小型企业的趋势走向,跨境电商的潮流带动了贸易经济的又一大爆炸性发展。在这个大背景下,第三...
基于地理复制和高效备份改进Pinterest的HBase可靠性 HBase是Pinterest的一个关键组件,自2013年以来一直用于在线服务。Pinterest的HBase集群数量庞大,约有50个HBase 1.2集群,每个集群都配置了ZSTD、CCSMAP、...
### Radware AppDirector SIP Solution Guide #### SIP概述 Session Initiation Protocol (SIP) 是一种用于在互联网...无论是初学者还是经验丰富的系统管理员,都可以从中受益,确保 SIP 通信的高效、安全和可靠。
老司机Xavier Amatriain的分享引起了我的兴趣:Lessons Learned from Building Real-Life Recommender Systems。主要分享了作为推荐系统老司机的他,多年开车后总结的禁忌和最佳实践,这样的采坑实录显然是很有...
在Python的世界里,Django是一个强大的Web开发框架,它遵循模型-模板-视图(MTV)架构模式,使得开发者可以高效地构建复杂的web应用程序。PyCharm是一款集成开发环境(IDE),尤其适合Python编程,它提供了丰富的...
ESP32-WROOM-32UE 技术规格书 ESP32-WROOM-32UE 是一款 Wi-Fi + 蓝牙 + 低功耗蓝牙模组,内置 ESP32 系列芯片,Xtensa 双核 32 位 LX6 处理器,支持高达 240 MHz 的时钟频率。该模组具有丰富的外设,包括 SD 卡、...
Win10 USBtoserial串口驱动(Prolific USB to Serial Comm Port),如果你的Win10认不到usb设备,就用它搞定 1、先安装windows 7_10_32_64,看是否成功,若不成功继续第二步; 2、进行YH340,先安装CH341...
A manual to set Up Fuseki with Jena--‐owl reasoning over an ontology created in Protégé and querying it via YASGUI
BSON is more "schema-less" than Protocol Buffers, which can give it an advantage in flexibility but also a slight disadvantage in space efficiency (BSON has overhead for ...
#### 一、概述 ... ... **1....- **高性能通信**: S7-300/400系列的以太网 CP 支持高速的数据传输,确保实时通信需求得以满足。...- **多种通信协议**: 支持包括PROFINET在内的多种工业通信协议,提高了与其他设备的互操作性...
Halite (named after the mineral) 是 C BitTorrent 客户端,基于 Rasterbar 软件的完美 libtorrent 库,同时也依赖于 Boost 库。Halite 是功能性的 BitTorrent 客户端,主要特性:文件选择和文件优先级...
达内学习笔记(corejava) 2009.11 达内学习笔记(corejava) 2009.11 达内学习笔记(corejava) 2009.11 达内学习笔记(corejava) 2009.11 达内学习笔记(corejava) 2009.11 达内学习笔记(corejava) ...