发布者订阅者模式之JAVA实现
 

1.发布者接口

package com.shoshana.publishsubscribe;

public interface IPublisher<M> {    public void publish(SubscribePublish subscribePublish, M message, boolean isInstantMsg);}

  

2.订阅者接口

package com.shoshana.publishsubscribe;

public interface ISubcriber<M> {    public void subcribe(SubscribePublish subscribePublish);

    public void unSubcribe(SubscribePublish subscribePublish);

    public void update(String publisher, M message);}

  

3.订阅器类

package com.shoshana.publishsubscribe;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;public class SubscribePublish<M> {//订阅器名称private String name;//订阅器队列容量final int QUEUE_CAPACITY = 20;//订阅器存储队列private BlockingQueue<Msg> queue = new ArrayBlockingQueue<Msg>(QUEUE_CAPACITY);//订阅者private List<ISubcriber> subcribers = new ArrayList<ISubcriber>();public SubscribePublish(String name) {this.name = name;}public void publish(String publisher, M message, boolean isInstantMsg) {if (isInstantMsg) {update(publisher, message);return;}Msg<M> m = new Msg<M>(publisher, message);if (!queue.offer(m)) {update();}}public void subcribe(ISubcriber subcriber) {subcribers.add(subcriber);}public void unSubcribe(ISubcriber subcriber) {subcribers.remove(subcriber);}public void update() {Msg m = null;while ((m = queue.peek()) != null) {this.update(m.getPublisher(), (M) m.getMsg());}}public void update(String publisher, M Msg) {for (ISubcriber subcriber : subcribers) {subcriber.update(publisher, Msg);}}
}class Msg<M> {private String publisher;private M m;public Msg(String publisher, M m) {this.publisher = publisher;this.m = m;}public String getPublisher() {return publisher;}public void setPublisher(String publisher) {this.publisher = publisher;}public M getMsg() {return m;}public void setMsg(M m) {this.m = m;}
}

 

4.发布者实现类

package com.shoshana.publishsubscribe;public class PublisherImpOne<M> implements IPublisher<M> {private String name;public PublisherImpOne(String name) {super();this.name = name;}public void publish(SubscribePublish subscribePublish, M message, boolean isInstantMsg) {subscribePublish.publish(this.name, message, isInstantMsg);}
}

  

 

 

5.订阅者实现类 

package com.shoshana.publishsubscribe;public class SubcriberImpOne<M> implements ISubcriber<M> {public String name;public SubcriberImpOne(String name) {super();this.name = name;}public void subcribe(SubscribePublish subscribePublish) {subscribePublish.subcribe(this);}public void unSubcribe(SubscribePublish subscribePublish) {subscribePublish.unSubcribe(this);}public void update(String publisher, M message) {System.out.println(this.name + "收到" + publisher + "发来的消息:" + message.toString());}
}

  

6.测试类

package com.shoshana.publishsubscribe;public class SubPubTest {public static void main(String[] args) {SubscribePublish<String> subscribePublish = new SubscribePublish<String>("订阅器");IPublisher<String> publisher1 = new PublisherImpOne<String>("发布者1");ISubcriber<String> subcriber1 = new SubcriberImpOne<String>("订阅者1");ISubcriber<String> subcriber2 = new SubcriberImpOne<String>("订阅者2");subcriber1.subcribe(subscribePublish);subcriber2.subcribe(subscribePublish);publisher1.publish(subscribePublish, "welcome", true);publisher1.publish(subscribePublish, "to", true);publisher1.publish(subscribePublish, "yy", false);}
}

测试结果:

com.shoshana.publishsubscribe.SubPubTest
订阅者1收到发布者1发来的消息:welcome
订阅者2收到发布者1发来的消息:welcome
订阅者1收到发布者1发来的消息:to
订阅者2收到发布者1发来的消息:toProcess finished with exit code 0

  

posted on 2019-04-23 23:26  shoshana~ 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/shoshana-kong/p/10759830.html

发布者订阅者模式之JAVA实现相关推荐

  1. 订阅者java_发布者订阅者模式之JAVA实现

    1.发布者接口 package com.shoshana.publishsubscribe; public interface IPublisher { public void publish(Sub ...

  2. 『设计模式』80年代的人们就已经领悟了设计模式-- 发布者/订阅者模式 (包括发布者/订阅者模式和观察者模式的区别)

    23种设计模式+额外常用设计模式汇总 (持续更新) 发布-订阅模式 在软件架构中,发布订阅是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者).而是将发布的消息分为 ...

  3. Vue2 MVVM 双向绑定(数据劫持+发布者-订阅者模式)

    参考文献:https://www.cnblogs.com/libin-1/p/6893712.html https://juejin.im/post/5b2f0769e51d45589f46949e ...

  4. 基于发布者/订阅者模式的小媛逛超市

    基于发布者/订阅者模式的小媛逛超市 一.概述 (1) 角色对应: 发布者=小媛,订阅者=超市. (2) 过程简介: 小明来到超市购物,超市统计小媛购物的种类数量. 二.代码结构 三.解决方案结构 四. ...

  5. JavaScript发布者-订阅者模式

    #仅简单描述,稍后会新增具体内容: 发布者-订阅者模式又称观察者模式:当一个对象(发布者)状态发生改变时,所有依赖它的对象(订阅者)都会得到通知. 该模式广泛应用在异步编程中:我们无需关注对象在异步运 ...

  6. Redis 学习笔记十 发布者订阅者模式与生产者消费者模式

    消息队列有两种场景 生产者消费者:一个消息只能有一个消费者 发布者订阅者:一个消息可以被多个消费者收到 redis从2.0版本开始支持pub/sub. 而Producer/Consumer是借助于re ...

  7. 自己用C++写一个发布者订阅者模式

    突然想整理一下自己用过的这个模式,半小时写下了这些代码. 首先定义两个基类,class notifier(发布者) 和 class receiver(订阅者). 在发布者类中有成员 std::vect ...

  8. dojo发布者订阅者模式(topic.publish/topic.subscribe)

    topic.publish: 用于发布消息,接收任意多个参数,第一参数为要发布的信息名字(唯一标识),如"init/method",其他参数为传递给订阅回调函数的参数. topic ...

  9. Redis实现消息队列和订阅发布模式

    转载:https://www.cnblogs.com/qlqwjy/p/9763754.html 在项目中用到了redis作为缓存,再学习了ActiveMq之后想着用redis实现简单的消息队列,下面 ...

最新文章

  1. 微信、移动端css布局的那些坑
  2. SIGIR 2021 | 基于不确定性正则化与迭代网络剪枝的终身情感分类方法
  3. html模块化标签,jq load()方法实现html 模块化。
  4. 上海梵科信息科技有限公司
  5. C语言之数据类型,C语言之数据类型
  6. 转载:牛客练习赛17 c 规律题
  7. 双鉴探测器是哪两种探测方式结合_报警的基本知识
  8. 计算机xp怎么调整亮度,[如何调整计算机屏幕的亮度] xp系统如何调整屏幕的亮度?屏幕亮度调整方法的详细说明...
  9. Linux 系统中成功恢复已删除的文件
  10. vuejs的学习笔记
  11. 碰到数学归纳法,一点感受
  12. 基于springmvc的Junit与Jmockit使用
  13. 2 树莓派设置连接WiFi,开启VNC等等
  14. 图像质量评价数据库TID2013连接
  15. 数据库:CHAR,VARCHAR,TEXT,ENUM ,SET,BINARY,VARBINARY 列的完整性约束
  16. python2.7安装失败_Pyside安装失败(Python 2.7.4)
  17. 简单json解析(org.json解析方式)
  18. 【每日新闻】2019年宏观经济展望!
  19. 【django】Windows下安装Redis
  20. 你知道Salesforce,但你知道Intuit吗?

热门文章

  1. goland dlv调试正在运行的程序
  2. Axure如何实现全选、全不选功能
  3. mysql安装卡在最后一步解决方案(附带万能安装方案)
  4. 网络编程:C10K问题而引出的reactor模型
  5. Map集合中的常用函数(java)
  6. 将cmder安装到windows xp上
  7. Android与HEIF格式图片适配方法
  8. 2020“东方国信杯”高校大数据开发大赛最终榜第三名思路分享
  9. 达美乐中国IPO遇挫:延迟全球发售 原计划上周上市敲钟
  10. Java毕业设计-在线点餐系统