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、大数据运维平台中的观察者模式
在这里插入图片描述

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

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

相关文章

VUE $SET源码

转载于:https://www.cnblogs.com/smzd/p/11634255.html

JS 日期格式化

1、将中国标准时间格式化为&#xff08;2017-06-06 15:05:04&#xff09; function formatDateTime(theDate) { var _hour theDate.getHours(); var _minute theDate.getMinutes(); var _second theDate.getSeconds(); var _year theDate.getFullYear() var _month theDat…

canvas 入门

<canvas>是HTML5新增的&#xff0c;是可以使用脚本&#xff08;JavaScript&#xff09;在其中绘制图像的HTML元素。 canvas是由HTML代码配合高度和宽度属性而定义出的可绘制区域&#xff0c;JavaScript代码可访问该区域&#xff0c;类似于其它通用的二维API&#xff0c;通…

Java实现消息队列服务

使用 JAVA 语言自己动手来写一个MQ (类似ActiveMQ,RabbitMQ) 主要角色 首先我们必须需要搞明白 MQ (消息队列) 中的三个基本角色 ProducerBrokerConsumer 整体架构如下所示 自定义协议 首先从上一篇中介绍了协议的相关信息,具体厂商的 MQ(消息队列) 需要遵循某种协议或者…

Knockout中ko.utils中处理数组的方法集合

每一套框架基本上都会有一个工具类&#xff0c;如&#xff1a;Vue中的Vue.util、Knockout中的ko.utils、jQuery直接将一些工具类放到了$里面&#xff0c;如果你还需要更多的工具类可以试试lodash。本文只介绍一下Knockout中ko.utils中处理数组的一些方法。 ko.utils.arrayForEa…

$nextTick 源码

x现在没时间&#xff0c;留个坑 转载于:https://www.cnblogs.com/smzd/p/11634665.html

java 发布订阅

1.发布者接口 package com.yy.subpub; /** * Description: 发布者接口 * author: leijing * date: 2016年9月29日 下午5:07:20 */ public interface IPublisher<M> { /** * Description: 向订阅器发布消息 * param subscribePublish 订阅器 * param message 消息 * para…

.NET Core Session的简单使用

前言 在之前的.NET 里&#xff0c;我们可以很容易的使用Session读取值。那今天我们来看看 如何在.NET Core中读取Session值呢&#xff1f; Session 使用Session之前&#xff0c;我们需要到Startup.cs中配置我们的服务如下&#xff1a; ①在ConfigureServices中加入&#xff1a;…

EasyNVR内网摄像机接入网关+EasyNVS云端管理平台,组件起一套轻量级类似于企业级萤石云的解决方案...

背景分析 对于EasyNVR我们应该都了解&#xff0c;主要应用于互联安防直播&#xff0c;对于EasyNVR&#xff0c;我们可以清楚的发现&#xff0c;EasyNVR的工作机制是EasyNVR拉取摄像机的RTSP/Onvif视频流&#xff0c;然后客户端可以通过访问EasyNVR服务端实现流分发&#xff0c;…

java.util.Queue用法

队列是一种特殊的线性表&#xff0c;它只允许在表的前端&#xff08;front&#xff09;进行删除操作&#xff0c;而在表的后端&#xff08;rear&#xff09;进行插入操作。进行插入操作的端称为队尾&#xff0c;进行删除操作的端称为队头。队列中没有元素时&#xff0c;称为空队…

Vim删除文件到行首或者行尾

vim用的不是很熟练&#xff0c;只是有时候需要的时候会学习一下 我们知道&#xff0c;vim有三种模式&#xff0c;一种是一般模式&#xff0c;一种是编辑模式&#xff0c;另外一种是命令行模式 在一般模式下&#xff0c;可以进行删除&#xff0c;复制粘贴等操作&#xff0c;在编…

新版本微信导致的ios表单bug

解决方法如下&#xff1a; $(document).delegate(input, textarea, select, blur, function(){setTimeout(function(){$(html).animate({height: 100.1vh}, 100, function(){$(this).animate({height: 100vh}, 1)})},100); }); 转载于:https://www.cnblogs.com/qdlhj/p/1033676…

Golang的值类型和引用类型的范围、存储区域、区别

常见的值类型和引用类型分别有哪些&#xff1f; 值类型&#xff1a;基本数据类型 int 系列, float 系列, bool, string 、数组和结构体struct&#xff0c;使用这些类型的变量直接指向存在内存中的值&#xff0c;值类型的变量的值通常存储在栈中。 引用类型&#xff1a;指针、sl…

python3之time模块

时间戳1: import time2: print(time.time()) 可读的时间格式1: import time2: print(time.ctime())3: later time.time() 6004: print(time.ctime(later)) 结果1: Wed Jan 30 17:11:49 20192: Wed Jan 30 17:21:49 2019 暂停程序(进程或者线程)1: time.sleep(secs) 计时时钟1…

网络规划设计(项目类业务)

前期准备&#xff1a;找经开部要到当地的现场结构图 1.和通信段约好时间&#xff0c;实地跑一趟&#xff0c;找到光缆、电缆的原汇聚点。 2.与车间人员沟通&#xff0c;看是否要迁汇聚点&#xff0c;倘若迁汇聚点&#xff0c;迁到哪里。 3.怎么从光缆/电缆的旧址迁到新址&#…

RPC框架实现原理

一、什么是RPC框架&#xff1f; RPC&#xff0c;全称为Remote Procedure Call&#xff0c;即远程过程调用&#xff0c;是一种计算机通信协议。 比如现在有两台机器&#xff1a;A机器和B机器&#xff0c;并且分别部署了应用A和应用B。假设此时位于A机器上的A应用想要调用位于B机…

jQuery安装

http://www.runoob.com/jquery/jquery-install.html 网页中添加jQuery&#xff1a; 方法一&#xff1a;可以从http://jquery.com/download/ 下载jQuery库 方法二&#xff1a;从CDN中载入jQuery 下载 jQuery 有两个版本的 jQuery 可供下载&#xff1a; Production version - 用于…

redhat相关配置

网络配置&#xff1a; vi /etc/sysconfig/network-scripts/ifcfg-eth BOOTPROTOstaticONBOOTyesIP配置IPADDR192.168.31.102NETMASK255.255.255.0GATEWAY192.168.31.1DNS1192.168.31.1redhat6&#xff1a;防火墙&#xff1a;1. 永久性生效开启&#xff1a;chkconfig iptables o…

zookeeper入门系列

zookeeper可谓是目前使用最广泛的分布式组件了。其功能和职责单一&#xff0c;但却非常重要。 在现今这个年代&#xff0c;介绍zookeeper的书和文章可谓多如牛毛&#xff0c;本人不才&#xff0c;试图通过自己的理解来介绍zookeeper&#xff0c;希望通过一个初学者的视角来学习…

java.lang.NumberFormatException: multiple points错误问题

最近项目一直会出现时间转换报错&#xff0c;一直不知道是什么问题??? java.lang.NumberFormatException: multiple pointsat sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1110)at java.lang.Double.parseDouble(Double.java:540)at java.text.Dig…