Java(发布/订阅模式)
1、概述
观察者模式又称为发布/订阅(Publish/Subscribe)模式
观察者设计模式涉及到两种角色:主题(Subject)和观察者(Observer)
(1)Subject模块
Subjec模块有3个主要操作
addObserver():注册添加观察者(申请订阅)
deleteObserver():删除观察者(取消订阅)
notifyObserver():主题状态发生变化时通知所有的观察者对象
(2)Oserver模块
Oserver模块有1个核心操作update(),当主题Subject状态改变时,将调用每个观察者的update()方法,更新通知。
(3)UML图
https://www.processon.com在线画的UML图
2、简单样例
(1)主题接口
package observer;public interface Subject {//添加观察者void addObserver(Observer obj);//移除观察者void deleteObserver(Observer obj);//当主题方法改变时,这个方法被调用,通知所有的观察者void notifyObserver();
}
(2)观察者接口
package observer;public interface Observer {//当主题状态改变时,更新通知public void update(int version);
}
(3)主题实现类,某某杂志
package observer;import java.util.ArrayList;
import java.util.List;public class MagazineSubject implements Subject{//存放订阅者private List<Observer> observers=new ArrayList<Observer>();//期刊版本private int version;@Overridepublic void addObserver(Observer obj) {observers.add(obj);}@Overridepublic void deleteObserver(Observer obj) {int i = observers.indexOf(obj);if(i>=0){observers.remove(obj);}}@Overridepublic void notifyObserver() {for(int i=0;i<observers.size();i++){Observer o=(Observer)observers.get(i);o.update(version);}}//该杂志发行了新版本public void publish(){//新版本this.version++;//信息更新完毕,通知所有观察者notifyObserver();}
}
(4)观察者实现类
package observer;public class CustomerObserver implements Observer{//订阅者名字private String name;private int version;public CustomerObserver(String name){this.name = name;}@Overridepublic void update(int version) {this.version=version;System.out.println("该杂志出新版本了");this.buy();}public void buy(){System.out.println(name+"购买了第"+version+"期的杂志!");}}
(5)测试类
package observer;public class Main{public static void main(String[] args) {//创建主题(被观察者)MagazineSubject magazine = new MagazineSubject();//创建三个不同的观察者CustomerObserver a = new CustomerObserver("A");CustomerObserver b = new CustomerObserver("B");CustomerObserver c = new CustomerObserver("C");//将观察者注册到主题中magazine.addObserver(a);magazine.addObserver(b);magazine.addObserver(c);//更新主题的数据,当数据更新后,会自动通知所有已注册的观察者magazine.publish();}
}
执行结果
该杂志出新版本了
A购买了第1期的杂志!
该杂志出新版本了
B购买了第1期的杂志!
该杂志出新版本了
C购买了第1期的杂志!
3、大数据运维平台中的观察者模式
Java(发布/订阅模式)相关推荐
- java 阅发布模式_redis发布订阅模式
一 前言 虽然有消息队列,我们还是要了解一下redis发布订阅模式哟!!!!! 二发布订阅模式 PUBLISH 命令向通道发送信息,此客户端称为publisher 发布者: SUBSCRIBE 向命令 ...
- Java实现redis消息队列发布/订阅模式
最近在一个老项目中需要用消息队列,本来想着用卡夫卡,但是试了几个版本之后发现jdk和卡夫卡版本一直对不上,最后选择用redis来实现消息队列的发布/订阅模式.感谢这位大佬的博客给了我很多的帮助,htt ...
- ibm mq java 发布订阅,JMS调用IBM MQ 监听模式的点对点模式
JMS调用IBM MQ 监听方式的点对点模式 前面三篇,第一篇讲了安装IBM MQ时遇到的一些问题.第二篇讲了点对点模式的调用.第三篇讲了发布订阅模式.本篇说一下监听模式. 监听模式只是在消费者端监听 ...
- Java中使用发布订阅模式
发布订阅者模式 概述 使用意图 使用场景 与MVC模式之间的关系 逻辑方法展示 代码演示 概述 发布订阅者模式其实在意图上等同于观察者模式,但是在结构上又有所不同. 在意图上,两者都是为对象创建一对多 ...
- Java实现发布订阅模式
什么是发布订阅模式 发布订阅模式是软件开发者很常见的一种设计模式,很多开源库都使用了发布订阅模式,例如RxJava.EventBus.Vue等,所以学习该模式还是很有必要的. 该模式中存在一个或多个发 ...
- 【EventBus】发布-订阅模式 ( 使用代码实现发布-订阅模式 )
文章目录 一.发布-订阅模式 二.代码实现发布-订阅模式 1.订阅者接口 2.订阅者实现类 3.发布者 4.调度中心 5.客户端 一.发布-订阅模式 发布订阅模式 : 发布者 Publisher : ...
- 利用zookeeper实现发布订阅模式
zookeeper应用 发布订阅 zk实现的方式是推拉结合,Client想服务端注册自己需要关注的节点,一旦节点的数据发生变更,那么Server会向对应的客户端发送Watcher事件通知,客户端接收到 ...
- 观察者模式VS发布-订阅模式
前言 观察者模式的大名,想必各位看官早已有所耳闻.从我们现实生活来说,微信公众号订阅.医院挂号叫号等都属于它的实际应用.在程序世界中,它是一种用于将代码解耦的设计模式,如果你想掌握并理解这种设计模式, ...
- kafka 发布-订阅模式_使用Apache Kafka作为消息系统的发布-订阅通信中的微服务,并通过集成测试进行了验证...
kafka 发布-订阅模式 发布-订阅消息系统在任何企业体系结构中都起着重要作用,因为它可以实现可靠的集成而无需紧密耦合应用程序. 在解耦的系统之间共享数据的能力并不是一个容易解决的问题. 考虑一个企 ...
- RabbitMQ六种队列模式-发布订阅模式
前言 RabbitMQ六种队列模式-简单队列 RabbitMQ六种队列模式-工作队列 RabbitMQ六种队列模式-发布订阅 [本文] RabbitMQ六种队列模式-路由模式 RabbitMQ六种队列 ...
最新文章
- 为什么运行了java文件老是404_哪位能帮助一下,JAVA中我运行页面时不能打开,总是出现404错误,为什么;用的是Tomcat7.0,win7的系统,...
- 纯数学思想——在哈尔滨的寒风中
- 嵌入式linux的学习笔记-共享内存(六)
- oracle java存储过程返回值_java程序调用Oracle 存储过程 获取返回值(无返回,非结果集,结果集)...
- 进入hbase命令_Zookeeper、Hbase安装部署
- java final定义_Java中final关键字的用法
- python星空代码_用python画星空源代码是什么?
- go语言设计初衷和优势
- 大一c语言书课后题答案,C语言课后习题答案
- android 手机如何备份通讯录,手机通讯录怎么备份
- ps自定义(新建)图框工具
- orbslam2 流程图_一种基于ORBSLAM2的八叉树建图方法与流程
- python 打开网页方法_python打开网页的方法
- Shake Shack上海第7家门店开业
- 高德地图鼠标划线显示距离并生成坐标点数据
- elementUI el-upload传额外的参数
- 【软考软件评测师】2020年下综合知识历年真题
- java电话面试_记一次java电话面试
- spss度量 名义 有序
- selenium之find_element_by_xpath定位元素
热门文章
- 异步复位的串联T触发器
- pg与oracle区别,PostgresQL 学习记录之与oracle区别(一)
- 织梦自定义html文本,织梦自定义标签dede:sql根据自定义字段填的文章id获取相关文章...
- ubuntu修改服务器端口,服务器环境之4:ubuntu14.04安装tomcat,端口修改
- 各Rendering Path技术以及其在Unity中的实现
- 利用matlab实现SAR 图像线性拉伸显示
- iOS中POST请求
- python超神之路:创建对象的9种方法
- VS2005无法启动解决方法(转)
- liunx驱动----异步通知