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.订阅器类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | 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.发布者实现类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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.订阅者实现类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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.测试类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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 ); } } |
测试结果:
1 2 3 4 5 6 7 | com.shoshana.publishsubscribe.SubPubTest 订阅者 1 收到发布者 1 发来的消息:welcome 订阅者 2 收到发布者 1 发来的消息:welcome 订阅者 1 收到发布者 1 发来的消息:to 订阅者 2 收到发布者 1 发来的消息:to Process finished with exit code 0 |
分类:
设计模式
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2018-04-23 怎样做一个软件项目经理