当前位置: 首页 > news >正文

如何实现观察者模式和发布-订阅模式?

要实现观察者模式和发布-订阅模式,你需要遵循一些基本的步骤和原则。下面分别介绍这两种模式的实现方法。

如何实现观察者模式:

观察者模式(Observer Pattern)是一种行为设计模式,用于维护观察者(Observer)对象与被观察者(Subject)对象之间的关系。这种关系是一对多的关系,即一个被观察者可以有多个观察者,当被观察者发生变化时,所有注册的观察者都会收到通知并进行相应的更新。

  1. 定义一个Subject(被观察者)类,包含以下内容:
  • 一个保存Observer(观察者)对象的列表。
  • 注册Observer的方法(addObserver)。
  • 移除Observer的方法(removeObserver)。
  • 通知所有Observer的方法(notifyObservers)。
  1. 定义一个Observer接口,包含以下内容:
  • 更新的方法(update)。
  1. 实现Observer接口的ConcreteObserver类(具体的观察者)。
  2. 使用Subject类和Observer接口来建立系统中的观察者和被观察者之间的关系。

如何实现发布-订阅模式:

发布-订阅模式(Publish-Subscribe Pattern)也是一种消息传递模式,与观察者模式类似,但它通常涉及一个称为Broker的中间实体,以维持发布者(Publisher)和订阅者(Subscriber)之间的解耦状态。

  1. 定义一个Publisher(发布者)类,包含以下内容:
  • 发布消息的方法(publish)。
  1. 定义一个Subscriber(订阅者)类,包含以下内容:
  • 订阅消息的方法(subscribe)。
  • 取消订阅的方法(unsubscribe)。
  1. 定义一个Broker(经纪人)类,包含以下内容:
  • 保存Publisher和Subscriber对象的列表。
  • 注册Publisher和Subscriber的方法。
  • 当Publisher发布消息时,通过Broker将消息分发给感兴趣的Subscriber。
  1. 使用Publisher类、Subscriber类和Broker类来建立系统中的发布者、订阅者和经纪人之间的关系。

代码示例:

以下是两种模式的一个简化版的JavaScript实现:

观察者模式

class Observer {update() {console.log('Observer has been updated.');}
}class Subject {constructor() {this.observers = [];}addObserver(observer) {this.observers.push(observer);}removeObserver(observer) {const index = this.observers.indexOf(observer);if (index > -1) {this.observers.splice(index, 1);}}notifyObservers() {this.observers.forEach(observer => observer.update());}
}const subject = new Subject();
const observer1 = new Observer();
const observer2 = new Observer();subject.addObserver(observer1);
subject.addObserver(observer2);subject.notifyObservers(); // Observer has been updated.

发布-订阅模式

class Publisher {publish(message) {console.log(`Publisher: ${message}`);}
}class Subscriber {subscribe(message) {console.log(`Subscriber: ${message}`);}
}class Broker {constructor() {this.publishers = [];this.subscribers = [];}register(publisher) {this.publishers.push(publisher);}register(subscriber) {this.subscribers.push(subscriber);}distribute(message) {this.subscribers.forEach(subscriber => subscriber.subscribe(message));}
}const broker = new Broker();
const publisher = new Publisher();
const subscriber1 = new Subscriber();
const subscriber2 = new Subscriber();broker.register(publisher);
broker.register(subscriber1);
broker.register(subscriber2);publisher.publish('Hello'); // Subscriber: Hello

请注意,实际应用中可能需要更复杂的逻辑和错误处理,但这些示例足以展示两种模式的基本概念。

相关文章:

  • 高压电工作业历年试题分享(含答案)
  • web鼠标前端设置:深入探索与个性化定制
  • 不是所有的硬盘柜都叫“安全专家”,但它做到了!
  • Lua - 魔兽世界SRP6网站源码(FastWeb)
  • Nginx05-负载均衡详解、LNMP+NFS、会话保持、负载均衡状态检查upstream-check、平滑升级
  • 大功率回馈式负载:行业竞争态势
  • 线性数据结构-栈
  • 【QEMU中文手册】2.2 调用方式(持续更新中)
  • Mimio安装
  • js实现简单计算器词法解析语法解析解释器,带可视化界面
  • 租用服务器提供服务
  • Docker 安装gitLab
  • web前端语言框架:探索现代前端开发的核心架构
  • Adobe Illustrator 基础学习
  • Java从放弃到继续放弃
  • 收藏网友的 源程序下载网
  • Angular2开发踩坑系列-生产环境编译
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • EventListener原理
  • JavaWeb(学习笔记二)
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Node + FFmpeg 实现Canvas动画导出视频
  • python3 使用 asyncio 代替线程
  • python学习笔记 - ThreadLocal
  • Rancher如何对接Ceph-RBD块存储
  • React的组件模式
  • socket.io+express实现聊天室的思考(三)
  • vue自定义指令实现v-tap插件
  • 分布式任务队列Celery
  • 记一次用 NodeJs 实现模拟登录的思路
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 实现菜单下拉伸展折叠效果demo
  • 详解NodeJs流之一
  • 智能网联汽车信息安全
  • #pragma multi_compile #pragma shader_feature
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (3)nginx 配置(nginx.conf)
  • (k8s)kubernetes集群基于Containerd部署
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (四)图像的%2线性拉伸
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (转)【Hibernate总结系列】使用举例
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .FileZilla的使用和主动模式被动模式介绍
  • .Net 4.0并行库实用性演练
  • .net MySql
  • .Net下的签名与混淆
  • .NET应用UI框架DevExpress XAF v24.1 - 可用性进一步增强