java 观察者模式_Java技术干货分享:深入理解观察者模式原理与技术

来源:编程技术精选

观察者模式(Observer Pattern)也叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式。这个模式的一个最重要的作用就是解耦。也就是将被观察者和观察者进行解耦,使得他们之间的依赖性更小,甚至做到毫无依赖。

3096dc2b890a979a4c9a13554c623be1.png
观察者模式的定义:该模式定义了对象之间的一对多依赖关系,Subject 对象是一,Observer 对象是多。当 Subject 对象的状态发生改变时,所有依赖于该 Subject 对象的 Observer 对象都会得到通知,并且自动更新。

仔细分析定义,要精确理解观察者模式主要注意三点:

  1. 定义了对象间的一对多依赖关系。
  2. 当 Subject 对象的状态发生改变时,所有依赖于该 Subject 对象的 Observer 对象都会得到通知。
  3. Observer 对象得到通知后,会自动更新,而不是被动。

经过上面的分析,下面我用代码简单实现上述逻辑。

1.首先需要定义一个观察者对象,内部含有data数据(getter、setter、构造方法、toString)。

public class Observer { private String data; public Observer(String data) { this.data = data; } public String getData() { return data; } public void setData(String data) { this.data = data; } @Override public String toString() { return "Observer{" + "data='" + data + ''' + '}'; }}

2.其次定义主题对象,主题对象内部提供观察者绑定(register)的接口,并且可以更新(update)所绑定的观察者对象。

d5a088072401756b70f74ac2d9811847.png
public class Subject { private List list = new ArrayList<>(); public void register(Observer observer){ list.add(observer); } public void update(){ list.forEach(observer -> { observer.setData("new"); System.out.println(observer.toString()); }); }}

3.最后就是main方法。

 public static void main(String[] args) { Subject subject = new Subject(); for (int i = 0; i < 3; i++) { Observer observer = new Observer("old"); subject.register(observer); System.out.println(observer.toString()); } System.out.println("update..."); subject.update(); }

控制台打印

Observer{data='old'}Observer{data='old'}Observer{data='old'}update...Observer{data='new'}Observer{data='new'}Observer{data='new'}

看到这里你也许会问:这就是观察者模式?这么简单?你莫不是在逗我?

291fee1b93cbaa6b2eb60c32ae3d0c90.png

是的,这就是观察者模式。我们从观察者模式的定义出发,抽取出关键的3点核心思想,对比代码和三点思想,是不是完美一致?百度一下"观察者模式",实现逻辑大都是复杂高深,其实就核心的思想来说,上面的示例足够了,其它扩展要以具体的业务需求来决定。比如:

  1. Subject 角色是应该定义成类?比如 内置的 java.util.Observable;还是应该定义成接口,以规避Java不支持多重继承的问题?
  2. 应该在什么时候订阅主题(或者说注册观察者)?是实例化观察者对象的同时?还是由客户自主决定?
  3. 是否应该实现取消订阅功能(或者说取消注册)?
  4. 主题对象通知观察者时,是否携带消息?换句话说,是“推”消息?还是“拉”消息?
  5. 是否支持多线程?

end:如果你觉得本文对你有帮助的话,记得关注点赞转发,你的支持就是我更新动力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/260355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python导入pyecharts错误没有pyecharts_python报No module named 'pyecharts'的错误怎么办?

问&#xff1a;导包的时候报No module named pyecharts的错误怎么办&#xff1f;答&#xff1a;报上述错误一般是因为pyecharts这个包没有下载成功&#xff0c;下面给大家介绍一下pyecharts库的安装与使用方法&#xff01;pyecharts是Python的数据可视化库&#xff0c;可以帮助…

iOS开发:AFNetworking、MKNetworkKit和ASIHTTPRequest比较

转&#xff1a;http://www.xue5.com/Mobile/iOS/747036.html 之前一直在使用ASIHTTPRequest作为网络库&#xff0c;但是由于其停止更新&#xff0c;iOS7上可能出现更多的问题&#xff0c;于是决定更换网络库。 目前比较流行的网络库主要有AFNetworking和MKNetworkKit&#xff…

java .listfiles_Java File.listFiles()

全屏Java Java File.listFiles()方法具有以下语法。public File [] listFiles()示例在下面的代码显示如何使用File.listFiles()方法。import java.io.File;// At: W w W. y I i ba I.C o mpublic class Main {public static void main(String[] args) {// create new fileFile …

基础入门_Python-内建函数.运维开发中eval内建函数的最佳实践?

简单介绍:说明: 在指定命名空间中计算参数字符串的有效表达式,并返回一个对象,Help on built-in function eval in module __builtin__:eval(...)eval(source[, globals[, locals]]) -> valueEvaluate the source in the context of globals and locals.The source may be a…

java简单毕设_计算机毕业设计之自定义毕设课题需要如何确定工作量

“ 真正让导师满意的不是众多普通的功能&#xff0c;而是那一抹有创意的充满着生活气息的小功能。”自定义毕设课题&#xff0c;我觉得这是一种体现学生创新的一种很好的手段&#xff0c;但是有一些学生却因为脑海中没有积累足够多的专业知识以及也没有对现实生活进行足够的思考…

C#基础系列第五篇

前言&#xff1a; 完全是我在学习过程中记录的笔记&#xff0c;只不过分享一下让很多刚开始学习.net编程的人能够很快的学会C#语言 多态的一些说明(1) 多态就是为了程序的可扩展性 (2)多态的使用&#xff1a;将不同的对象当作父类来看&#xff0c;屏蔽掉各个对象间的不同&#…

罗伯特·帕丁森Robert Pattinson(2)

2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/Bettyty/blog/756873

网博士自助建站系统_自助建站:自助建站到底好还是不好?

自助建站到底好还是不好&#xff1f;很多想要做企业网站的企业都比较关心这个问题&#xff0c;因为自助建站便宜、快&#xff0c;有的自助建站做出来的效果还非常好&#xff0c;不输于定制的网站的效果&#xff0c;那为什么自助建站大都还很便宜呢&#xff1f;东西还好还便宜的…

linux tar.gz zip 解压缩 压缩命令

http://apps.hi.baidu.com/share/detail/37384818 download ADT link http://dl.google.com/android/ADT-0.9.6.zip download SDK link http://dl.google.com/android/android-sdk_r11-linux_x86.tgz(能够通过翻墙得到详细的文件名称&#xff0c;再通过链接下载就可以) tar -c:…

HNU 11720 God Created The Integers

原题传送&#xff1a;http://acm.hnu.cn/online/?actionproblem&typeshow&id11720&courseid0 对于这条式子&#xff1a; 和下面的式子是等价的&#xff1a; Sp (p2 - 1) / 2 - (p - 1) / 4 那么求出Sp后有rp*Sp ≡ 1 (mod p)&#xff0c;用扩展GCD求出rp就行了。…

java equals 的区别_java中equals和==的区别是什么-百度经验

在jdk1.5以上的版本中&#xff0c;基本类型和封装类能自动转化&#xff0c;与String类型的对象和字符串常量类似。Integer i1 123; Integer i2 123 int i 123; Integer i3 new Integer(123); Integer i4 new Integer(123); …

ps命令使用 进程查看

ps命令是Process Status的缩写用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照&#xff0c;就是执行ps命令的那个时刻的那些进程&#xff0c;如果想要动态的显示进程信息&#xff0c;就可以使用top命令。使用该命令可以确定有哪些进程正在运行和运行的状态…

stm32例程_如何学习STM32?

阅读全文大约10min//封面为我现在使用的STM32型号&#xff1a;旗舰版 Stm32f103ZE//本文内容是对正点原子的资料整理参考资料&#xff1a;CM3权威指南/CM4权威指南&#xff08;ARM提供&#xff09;芯片参考手册 STM32F10x中文参考手册 芯片数据手册 STM32F103xCDE_DS_CH_V5.pdf…

java compile_java中的CompileAPI入门及使用

介绍java5之前我们可以通过java提供的tools.jar来操作java编译器&#xff0c;java6提供了新的API&#xff0c;让我们可以更方便的调用。包名为javax.tools。使用通过文件编译String filePath "D:\\Client.java";//获取java编译器JavaCompiler javaCompiler ToolPro…

《Two Days DIV + CSS》读书笔记——CSS选择器

1.1.2 CSS选择器 CSS 选择器最基本的有四种&#xff1a;标签选择器、ID 选择器、类选择器、通用选择器。 【标签选择器】 一个完整的 HTML 页面由很多不同的标签组成&#xff0c;而标签选择器&#xff0c;则是决定哪些标签采用相应的 CSS 样式&#xff0c;比如&#xff0c;在 s…

TempDB为什么要根据CPU数目来决定文件个数

在SQL Server的世界中&#xff0c;SQL Server在Windows之上有一套自己的任务调度和资源分配系统&#xff0c;这使得SQL Server作为Windows的一个进程&#xff0c;却可以处理大量的并发&#xff0c;这些任务调度和资源分配非常像一个操作系统&#xff0c;因此SQL Server在Window…

python基础到实践_一本书搞定Python入门到实践

题图&#xff1a;Photo by Aaron Burden on Unsplash上周介绍了几本Python从入门到进阶书籍&#xff0c;今天推荐一本入门好书《Python编程&#xff1a;从入门到实践》&#xff0c;适合零基础小白&#xff0c;也适合有其它语言背景的程序员。书中有哪些亮点&#xff1f;2016年出…

Linux网卡eth0变成eth1修改方法

由于换了主板&#xff0c;集成网卡mac地址变了&#xff0c;70-persistent-net.rules中仍然保留了老网卡的内容&#xff0c;新网卡则被识别为eth1。 将表示老网卡的行注释掉&#xff0c;然后将表示新网卡的行中eth1改成eth0&#xff0c;在把网卡配置文件ifcfg-eth0的mac地址改成…

java微博模拟登陆_java 模拟登录新浪微博(通过cookie)

这几天一直在研究新浪微博的爬虫&#xff0c;发现爬取微博的数据首先要登录。本来打算是通过账号和密码模拟浏览器登录。但是现在微博的登录机制比较复杂。通过账号密码还没有登录成功QAQ。所以就先记录下&#xff0c;通过cookie直接访问自己的微博主页。微博登录的认证过程微博…

硬盘结构,主引导记录MBR,硬盘分区表DPT,主分区、扩展分区和逻辑分区,电脑启动过程...

filex的文件系统看的云里雾里&#xff0c;还是先总结下FAT的一些基本知识吧。硬盘结构硬盘有很多盘片组成&#xff0c;每个盘片的每个面都有一个读写磁头。如果有N个盘片。就有2N个面&#xff0c;对应2N个磁头(Heads)&#xff0c;从0、1、2开始编号。每个盘片的半径均为固定值R…