https://www.cnblogs.com/coderdxj/p/9627310.html

java 观察这模式(发布订阅模式)

 

观察者设计模式定义了对象间的一种一对多的组合关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。

发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。

  • 抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
  • 抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
  • 具体被观察者角色:也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知。
  • 具体观察者角色:实现抽象观察者角色所需要的更新接口,一边使本身的状态与制图的状态相协调。

java实现:

抽象被观察者(抽象主题):Observable.java

抽象被观察者的具体实现(主题服务):ObservableImpl.java

抽象观察者(用户(订阅者)的抽象):Observer.java

抽象观察者的具体实现(用户(订阅者)具体实现):User.java

Observable.java(被订阅服务的实现)

/**
* @ClassName Observerable 被观察者(被订阅的对象抽象)
* @Description TODO
* @author jxd
* @Date 2018年9月11日 上午10:15:33
* @version 1.0.0
*/
public interface Observable {
//注册用户
public void registerUser(Observer observer);
//移除用户
public void removeUser(Observer observer);
//通知观察者
public void notifyObserver();

}

ObservableImpl.java(被订阅服务的实现)

/**
* @ClassName ObservableImpl 抽象被观察者(主题服务)的具体实现
* @Description TODO
* @author jxd
* @Date 2018年9月11日 下午1:58:42
* @version 1.0.0
*/
public class ObservableImpl implements Observable {

private List<Observer> userList = new ArrayList<>();;

private String message;

@Override
public void registerUser(Observer observer) {
// TODO Auto-generated method stub
userList.add(observer);
}

@Override
public void removeUser(Observer observer) {
// TODO Auto-generated method stub
if (observer != null && userList != null && userList.size() > 0) {
userList.remove(observer);
}
}

@Override
public void notifyObserver() {
// TODO Auto-generated method stub
userList.forEach(x -> {
x.getTopicNotification(message);
});
}

public void setInformation(String str){
this.message=str;
notifyObserver();
}

}

Observer.java(订阅者的抽象)

/**
* @ClassName Observer 抽象观察者(需要订阅主题的用户)
* @Description TODO
* @author jxd
* @Date 2018年9月11日 上午10:16:49
* @version 1.0.0
*/
public interface Observer {

/**
* @Description (得到主题(订阅对象)返回的通知)
* @param message
*/
public void getTopicNotification(String message);
}

User.java(订阅对象的实现)

public class User implements Observer {

private String name;
private String message;

public User(String name) {
this.name = name;
}

@Override
public void getTopicNotification(String message) {
// TODO Auto-generated method stub
this.message = message;
read();

}

public void read() {
System.out.println(name + ":" + "收到消息内为:" + message);
}

}

测试。。。。。。。。。。

public static void main(String[] args) {
Observer z=new User("jinxudong");
Observer s = new User("jinxudong1");
Observer e = new User("jinxudong2");
ObservableImpl wechatServer=new ObservableImpl();
wechatServer.registerUser(s);
wechatServer.registerUser(z);
wechatServer.registerUser(e);
wechatServer.setInformation("发布第一次消息...");
System.out.println("-------------------测试取消关注 -------");
wechatServer.removeUser(z);
wechatServer.setInformation("发布第二次消息...");

}

测试结果:

jinxudong1:收到消息内为:发布第一次消息...
jinxudong:收到消息内为:发布第一次消息...
jinxudong2:收到消息内为:发布第一次消息...
-------------------测试取消关注 -------
jinxudong1:收到消息内为:发布第二次消息...
jinxudong2:收到消息内为:发布第二次消息...

java 发布订阅的更多相关文章

  1. RabbitMQ/JAVA (发布/订阅模式)

    发布/订阅模式即生产者将消息发送给多个消费者. 下面介绍几个在发布/订阅模式中的关键概念-- 1. Exchanges (转发器) 可能原来我们都是基于一个队列发送和接收消息.现在介绍一下完整的消息传 ...

  2. java实现 redis的发布订阅(简单易懂)

    redis的应用场景实在太多了,现在介绍一下它的几大特性之一   发布订阅(pub/sub). 特性介绍: 什么是redis的发布订阅(pub/sub)?   Pub/Sub功能(means Publ ...

  3. java/rabbitmp发布订阅示例(转)

    原文:http://www.cnblogs.com/tinmh/p/6134875.html 发布/订阅模式即生产者将消息发送给多个消费者. 下面介绍几个在发布/订阅模式中的关键概念-- 1. Exc ...

  4. (转) RabbitMQ学习之发布/订阅(java)

    http://blog.csdn.net/zhu_tianwei/article/details/40887733 参考:http://blog.csdn.NET/lmj623565791/artic ...

  5. 我在生产项目里是如何使用Redis发布订阅的?(二)Java版代码实现(含源码)

    上篇文章讲了在实际项目里的哪些业务场景用到Redis发布订阅,这篇文章就讲一下,在Java中如何实现的. 图解代码结构 发布订阅的理论以及使用场景大家都已经有了大致了解了,但是怎么用代码实现发布订阅呢 ...

  6. java 观察这模式(发布订阅模式)

    观察者设计模式定义了对象间的一种一对多的组合关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新. 发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息. 抽象 ...

  7. java 多线程 发布订阅模式:发布者java.util.concurrent.SubmissionPublisher;订阅者java.util.concurrent.Flow.Subscriber

    1,什么是发布订阅模式? 在软件架构中,发布订阅是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者).而是将发布的消息分为不同的类别,无需了解哪些订阅者(如果有的话 ...

  8. redis发布订阅Java代码实现

    Redis除了可以用作缓存数据外,另一个重要用途是它实现了发布订阅(pub/sub)消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. 为了实现redis的发布订阅机制,首先要打开re ...

  9. Redis学习笔记8--Redis发布/订阅

    发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的耦合,这点和设计模式中的观察者模式比较相似.pub /sub不仅仅解决发布者和订阅者直接代码级别耦合也解决两者 ...

随机推荐

  1. windows下,给golang编译的exe添加一个图标

    通过go build生成的exe文件,通常是一个默认的图标,发给别人的时候,总觉得像病毒,下面我们来给他加一个好看的图标,让他看起来正经一些. 1.找到一个喜欢的图片. 2.通过工具或是在线工具生成. ...

  2. luoguP2664树上游戏(点分治)

    题目链接:https://www.luogu.org/problem/P2664 题意:给定一颗带点权的树,结点数n<=1e5,点权<=1e5,用s(i,j)表示从i到j的路径上不同点权数 ...

  3. 20191204-使用nginx解决ajax测试调用接口跨域问题

    问题描述 之前要测试一个http的接口,在postman中测试成功,但使用ajax调用却跨域.于是通过使用ngin反向代理的方式来解决ajax调用跨域问题 测试页面的内容 <html> & ...

  4. [转帖]判断Linux进程在哪个CPU核运行的方法

    判断Linux进程在哪个CPU核运行的方法   原文网址:http://www.embeddedlinux.org.cn/html/xinshourumen/201601/30-5013.html 问 ...

  5. Oracle-DQL 4- 多表查询

    多表查询: 1.笛卡尔积SELECT * FROM dept;--查询员工的信息和其所在部门的信息SELECT ename,job,dname,locFROM emp,dept; --集合A中的所有元 ...

  6. CentoS里Tomcat端口开放

    1.发现安装好tomcat后,发现无法访问tomcat首页,后来发现防火墙没有开放8080端口. 需注意的是:CentOS 7防火墙换用Friewalld了,所以要用以下命令将端口号加进防火墙: fi ...

  7. Intellj Idea 快捷键入门

    Intellj IDEA快捷键入门 时间: 2019/11/29 系统: Win10系统 版本 :Intellj Idea 2018.3 背景: 入手Intellj idea 两个月了,总结一下一些常 ...

  8. Dijkstra(模板)

    #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include <cstdio>//sprintf islower isupp ...

  9. [读书笔记]Hadoop权威指南 第3版

    下面归纳概述了用于设置MapReduce作业输出的压缩格式的配置属性.如果MapReduce驱动使用了Tool接口,则可以通过命令行将这些属性传递给程序,这比通过程序代码来修改压缩属性更加简便. Ma ...

  10. X86逆向11:F12暂停法的妙用

    本节课将介绍F12暂停法的使用技巧,F12暂停法的原理其实很简单,当我们点击OD中的暂停按钮时,OD会将当前的堆栈状态保存起来,并暂停当前窗体的线程执行,直到我们点击运行按钮OD才会唤醒全部线程并继续 ...