首页 > 编程知识 正文

什么是发布订阅模式,发布订阅机制

时间:2023-05-05 07:16:39 阅读:178195 作者:4471

使用发布器模式概述场景和MVC模式之间的关系逻辑方法显示代码演示

概要

读者模型有意地与观察者模型相同,但在结构上不同。 有意创建对象的一对多关系,并在对象发生更改后通知其他对象。 在结构上,查看器模式只有对象和查看器,而发布订阅模式中存在发布者、订阅者和中间调度中心。

有意发布订阅者模式允许您创建对象的一对多关系,并在发布者发生更改时通知订阅者。

读者通过场景使用的场景很广泛,目前我们使用的消息中间件,如Rocket MQ、Rabbit MQ等都用于发布读者的模型中。 论坛和微博等社交网站也经常使用发布者的订阅者模式。 用户a可以订阅用户b,用户b在他们发表消息之后,经由调度中心c选择(广播)他们的订阅者。 与MVC模式的关系在MVC模式下,发布者和订阅者必须属于模型,调度中心属于服务,并且必须在控制器层进行订阅、取消订阅和信息发布。 视图层是用户操作页面。

逻辑方法包括subscriber SubPub 1.提供订阅、2 .取消订阅、3 .发布信息等。 1 .添加订阅时发生的事情:订阅者id和发布者id的相关信息2 .取消订阅时发生的事情:删除订阅者id和发布者id的相关信息3 .发生发布信息3360检索与发布者id相关的订阅者id,找到订阅者发送数据方法定义:1 .订阅(提供订阅者和发行者id )2.取消订阅)提供订阅者和发行者id )3.3.1发行信息)发行者id,发行信息) -默认所有者为3.2发行信息)发行者id,发行信息,通知者列表简单示例 publisher代码演示Publisher /** * @=-=发布器。 模型数据只要定义发布者具有的属性即可,操作交给控制器。 */public class publisher { privateintegerid; //唯一的。 每个发行者的id都不一样//constructorandgettersetter } subscriber/* * * @=-=订阅者。 模型类只负责数据的定义,并将操作传递给控制层。 * /公共类订阅者{ privateintegerid; //constructorandgettersetter }消息公共类消息{权限内容; //constructorandgettersetter } subpubcentral * * @=-=发布订阅中心。 */publicinterfacesubpubcentral { publicbooleansubscribe (publisher publisher,Subscriber subscriber ); publicbooleanunsubscribe (publisher publisher,Subscriber subscriber ); 公共语音公共(publisher publisher,消息消息消息; } subpubcentralimplpublicclasssubpubcentalimplimplementssubpubcentral { privatestaticmapinteger,SetInteger PubSubMap; //存储所有发行者的相应订阅者。 static{ PubSubMap=new HashMap (; } @ overridepublicbooleansubscribe (publisher publisher,subscriber ) { try } setintegersubscriberset=pubsub map . //获得当前发布者的所有订阅者if(subscriberset==null )//为空,并且以前不存在订阅者(subscriberSet=new HashSet ); boolean added=subscribers et.add (subscriber.getid (); //订阅者if(added )//订阅者添加成功。 returnpubsubmap.put (publisher.getid )、subscriberSet )!=空; return fa

lse; //订阅者添加失败或者该订阅之前则订阅了发布者 }catch(Exception e){ e.printStackTrace(); } return false; } @Override public boolean unsubscribe(Publisher publisher, Subscriber subscriber) { try{ Set<Integer> subscriberSet = PubSubMap.get(publisher.getId()); if(subscriberSet == null) return false; boolean removed = subscriberSet.remove(subscriber.getId()); //删除取消订阅者 if(removed) PubSubMap.put(publisher.getId(),subscriberSet); //更新订阅者列表 return removed; }catch (Exception e){ e.printStackTrace(); } return false; } @Override public void publish(Publisher publisher, Message message) { Set<Integer> subscriberSet = PubSubMap.get(publisher.getId()); //遍历订阅者发送消息。 此处简单实现: 只需要打印出拿到的所有订阅者即可 for (Integer subscriber: subscriberSet) { System.out.println("向发布者[" + publisher.getId() +"]的订阅者[" + subscriber + "]发送消息: " + message); } }} SubscriberController /*** * @=-= 控制层,负责控制订阅者的一系列行为。 */public class SubscriberController { private SubPubCentral subPubCentral; public SubscriberController(SubPubCentral subPubCentral) { this.subPubCentral = subPubCentral; } public void subscribe(Integer subscriberId,Integer publisherId){ subPubCentral.subscribe(new Publisher(publisherId),new Subscriber(subscriberId)); } public void unsubscribe(Integer subscriberId,Integer publisherId){ subPubCentral.unsubscribe(new Publisher(publisherId),new Subscriber(subscriberId)); }} PublisherController /** * @=-= 控制层。负责控制发布者的一系列行为。 */public class PublisherController { private SubPubCentral subPubCentral; //订阅发布中心。 public PublisherController(SubPubCentral subPubCentral) { this.subPubCentral = subPubCentral; } /** * @=-= 发布数据,假设前端传递的是一个id对象和一个内容对象。简单化,实际上会传递一个包装数据过来. * @param publisherId * @param message */ public void publish(Integer publisherId,String message){ subPubCentral.publish(new Publisher(publisherId),new Message(message)); }} Main package cn.tblack.observable;public class Main { /** * @=-= 测试发布订阅。模拟事件。 * @param args */ public static void main(String[] args) { SubPubCentral subPubCentral = new SubPubCentalImpl(); PublisherController publisherController = new PublisherController(subPubCentral); SubscriberController subscriberController = new SubscriberController(subPubCentral); subscriberController.subscribe(1,1); subscriberController.subscribe(2,1); publisherController.publish(1,"我今天很好"); System.out.println("n----------------------------------------------------nn"); subscriberController.unsubscribe(1,1); publisherController.publish(1,"我过得很好"); }}

执行结果:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。