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(发布/订阅模式)相关推荐

  1. java 阅发布模式_redis发布订阅模式

    一 前言 虽然有消息队列,我们还是要了解一下redis发布订阅模式哟!!!!! 二发布订阅模式 PUBLISH 命令向通道发送信息,此客户端称为publisher 发布者: SUBSCRIBE 向命令 ...

  2. Java实现redis消息队列发布/订阅模式

    最近在一个老项目中需要用消息队列,本来想着用卡夫卡,但是试了几个版本之后发现jdk和卡夫卡版本一直对不上,最后选择用redis来实现消息队列的发布/订阅模式.感谢这位大佬的博客给了我很多的帮助,htt ...

  3. ibm mq java 发布订阅,JMS调用IBM MQ 监听模式的点对点模式

    JMS调用IBM MQ 监听方式的点对点模式 前面三篇,第一篇讲了安装IBM MQ时遇到的一些问题.第二篇讲了点对点模式的调用.第三篇讲了发布订阅模式.本篇说一下监听模式. 监听模式只是在消费者端监听 ...

  4. Java中使用发布订阅模式

    发布订阅者模式 概述 使用意图 使用场景 与MVC模式之间的关系 逻辑方法展示 代码演示 概述 发布订阅者模式其实在意图上等同于观察者模式,但是在结构上又有所不同. 在意图上,两者都是为对象创建一对多 ...

  5. Java实现发布订阅模式

    什么是发布订阅模式 发布订阅模式是软件开发者很常见的一种设计模式,很多开源库都使用了发布订阅模式,例如RxJava.EventBus.Vue等,所以学习该模式还是很有必要的. 该模式中存在一个或多个发 ...

  6. 【EventBus】发布-订阅模式 ( 使用代码实现发布-订阅模式 )

    文章目录 一.发布-订阅模式 二.代码实现发布-订阅模式 1.订阅者接口 2.订阅者实现类 3.发布者 4.调度中心 5.客户端 一.发布-订阅模式 发布订阅模式 : 发布者 Publisher : ...

  7. 利用zookeeper实现发布订阅模式

    zookeeper应用 发布订阅 zk实现的方式是推拉结合,Client想服务端注册自己需要关注的节点,一旦节点的数据发生变更,那么Server会向对应的客户端发送Watcher事件通知,客户端接收到 ...

  8. 观察者模式VS发布-订阅模式

    前言 观察者模式的大名,想必各位看官早已有所耳闻.从我们现实生活来说,微信公众号订阅.医院挂号叫号等都属于它的实际应用.在程序世界中,它是一种用于将代码解耦的设计模式,如果你想掌握并理解这种设计模式, ...

  9. kafka 发布-订阅模式_使用Apache Kafka作为消息系统的发布-订阅通信中的微服务,并通过集成测试进行了验证...

    kafka 发布-订阅模式 发布-订阅消息系统在任何企业体系结构中都起着重要作用,因为它可以实现可靠的集成而无需紧密耦合应用程序. 在解耦的系统之间共享数据的能力并不是一个容易解决的问题. 考虑一个企 ...

  10. RabbitMQ六种队列模式-发布订阅模式

    前言 RabbitMQ六种队列模式-简单队列 RabbitMQ六种队列模式-工作队列 RabbitMQ六种队列模式-发布订阅 [本文] RabbitMQ六种队列模式-路由模式 RabbitMQ六种队列 ...

最新文章

  1. 为什么运行了java文件老是404_哪位能帮助一下,JAVA中我运行页面时不能打开,总是出现404错误,为什么;用的是Tomcat7.0,win7的系统,...
  2. 纯数学思想——在哈尔滨的寒风中
  3. 嵌入式linux的学习笔记-共享内存(六)
  4. oracle java存储过程返回值_java程序调用Oracle 存储过程 获取返回值(无返回,非结果集,结果集)...
  5. 进入hbase命令_Zookeeper、Hbase安装部署
  6. java final定义_Java中final关键字的用法
  7. python星空代码_用python画星空源代码是什么?
  8. go语言设计初衷和优势
  9. 大一c语言书课后题答案,C语言课后习题答案
  10. android 手机如何备份通讯录,手机通讯录怎么备份
  11. ps自定义(新建)图框工具
  12. orbslam2 流程图_一种基于ORBSLAM2的八叉树建图方法与流程
  13. python 打开网页方法_python打开网页的方法
  14. Shake Shack上海第7家门店开业
  15. 高德地图鼠标划线显示距离并生成坐标点数据
  16. elementUI el-upload传额外的参数
  17. 【软考软件评测师】2020年下综合知识历年真题
  18. java电话面试_记一次java电话面试
  19. spss度量 名义 有序
  20. selenium之find_element_by_xpath定位元素

热门文章

  1. 异步复位的串联T触发器
  2. pg与oracle区别,PostgresQL 学习记录之与oracle区别(一)
  3. 织梦自定义html文本,织梦自定义标签dede:sql根据自定义字段填的文章id获取相关文章...
  4. ubuntu修改服务器端口,服务器环境之4:ubuntu14.04安装tomcat,端口修改
  5. 各Rendering Path技术以及其在Unity中的实现
  6. 利用matlab实现SAR 图像线性拉伸显示
  7. iOS中POST请求
  8. python超神之路:创建对象的9种方法
  9. VS2005无法启动解决方法(转)
  10. liunx驱动----异步通知