当前位置:网站首页>观察者模式
观察者模式
2022-08-01 12:38:00 【51CTO】
《Head First Design Pattern》一书中对观察者模式的定义如下:
The Observer Pattern defines a one-to-many dependency objects so that when one object changes state, all of its dependents are notified and updated automatically.
观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。
从根本上说,该模式必须包含两个角色:观察者和被观察对象。下面是设计模式中包含角色的UML类图(来自百度百科)。

观察者(Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。
被观察对象(Subject)发生了某种变化,从容器中得到所有注册过的观察者,将变化通知观察者。
下面举这样一个例子:比如一个小游戏,A说出一个十进制的数,B说出其对应的二进制结果,C说出其对应的八进制结果,D说出其对应的十六进制结果。
使用观察者模式A可以作为被观察者(Subject),B、C、D可以作为观察者(Observer)。
下面是Java代码示例:
观察者接口:
被观察者接口:
实体被观察者A:就是游戏中的A
实体观察者B:游戏中的B,将A给的数字转成二进制
实体观察者D:游戏中的D,将A给的数字转成十六进制
观察者模式测试代码:我们开始做游戏了
运行结果:
其实Java JDK本身提供了设计模式等额实现:
java.util.Observer是一个接口,观察者接口,相当于我们上面的IObserver接口。我们需要实现一个观察者的时候只需要实现这个接口就OK了。
java.util.Observable是一个类,被观察者类,我们需要实现一个被观察者的时候只需要继承这个类就OK了。
边栏推荐
- CAN通信的数据帧和远程帧
- Visualization of lag correlation of two time series data in R language: use the ccf function of the forecast package to draw the cross-correlation function, and analyze the lag correlation according t
- Towhee 每周模型
- Do wildcard SSL certificates not support multiple domains?
- R语言ggplot2可视化:使用ggpubr包的geom_exec函数执行geom_*函数(没有任何参数需要放置在aes中)
- R语言ggplot2可视化:使用ggpubr包的ggscatter函数可视化散点图、使用xscale函数指定X轴坐标轴度量调整方式、设置x轴坐标为scientific使用科学计数法显示坐标值
- Find objects with the same property value Cumulative number Summarize
- How to Integrate Your Service Registry with Istio?
- 批量任务导入到数据库中
- CloudCompare&PCL ICP配准(点到面)
猜你喜欢

华盛顿大学、Allen AI 等联合 | RealTime QA: What's the Answer Right Now?(实时 QA:现在的答案是什么?)

Beyond Compare 4 trial period expires

深入解析volatile关键字

【公开课预告】:超分辨率技术在视频画质增强领域的研究与应用

并发编程10大坑,你踩过几个?

Pytest e-commerce project combat (below)

How do programmers solve online problems gracefully?

Data frame and remote frame of CAN communication

A new generation of ultra-safe cellular batteries, Sihao Airun goes on sale starting at 139,900 yuan

Audio and Video Technology Development Weekly | 256
随机推荐
Alibaba Cloud Official Redis Development Specification
AI目标分割能力,无需绿幕即可实现快速视频抠图
Pytest e-commerce project combat (below)
重磅消息 | Authing 实现与西门子低代码平台的集成
通讯录(静态版)(C语言)(VS)
pandas连接oracle数据库并拉取表中数据到dataframe中、筛选当前时间(sysdate)到一个小时之前的所有数据(筛选一个小时的范围数据)
【StoneDB Class】Introduction Lesson 2: Analysis of the Overall Architecture of StoneDB
表连接详解
Envoy source code flow chart
关于亚马逊测评,你了解多少?
软件设计师考点汇总(室内设计师个人总结)
如何设计一个分布式 ID 发号器?
【Unity3D插件】AVPro Video插件分享《视频播放插件》
MMF的初步介绍:一个规范化的视觉-语言多模态任务框架
动态库、静态库浅析
LeetCode_位运算_简单_405.数字转换为十六进制数
如何利用DevExpress控件绘制流程图?看完这篇文章就懂了!
SQL函数 %SQLUPPER
How to get the address of WeChat video account (link address of WeChat public account)
sql中ddl和dml(数据库表与视图的区别)