设计模式 ~ 发布订阅者

发表订阅者模式

用于实现对象之间的松耦合通信;

在该模式中,存在一个或多个发布者(Publishers)和一个或多个订阅者(Subscribers);

发布者负责发布消息,而订阅者负责订阅感兴趣的消息并在接收到消息时做出相应的处理。

对比观察者模式

Subject 和 Observer 直接绑定,中间无媒介;

Publisher 和 Observer 相互不认识,中间有媒介;

代码演示

javascript 复制代码
function PubSub() {
  this.subscribers = {}
}

subscribe 方法,订阅者可以注册自己来接收特定事件的通知;

unsubscribe 方法,订阅者可以取消对特定事件的订阅;

publish 方法,发布者可以发布特定事件及其相关的数据。

javascript 复制代码
PubSub.prototype = {
  subscribe: function (event, callback) {
    if (!this.subscribers[event]) {
      this.subscribers[event] = []
    }
    this.subscribers[event].push(callback)
  },
  unsubscribe: function (event, callback) {
    if (this.subscribers[event]) {
      var index = this.subscribers[event].indexOf(callback)
      if (index !== -1) {
        this.subscribers[event].splice(index, 1)
      }
    }
  },
  publish: function (event, data) {
    if (this.subscribers[event]) {
      this.subscribers[event].forEach(function (callback) {
        callback(data)
      })
    }
  }
}

创建实例

javascript 复制代码
const pubsub = new PubSub()

订阅

javascript 复制代码
pubsub.subscribe('message', function (data) {
  console.log('收到消息:', data)
})

发布

javascript 复制代码
pubsub.publish('message', '发布消息 ~~~')

VUE

Vue2 实例本身就支持自定义事件,但 Vue3 不再支持;

推荐使用 mitt ,文档 https://github.com/developit/mitt

mitt 没有 once ,也可以使用 event-emitter https://www.npmjs.com/package/event-emitter

创建单独的 .js 文件、保证单例性

javascript 复制代码
import mitt from 'mitt'
const emitter = mitt() // 单例
export default emitter

发布和订阅

javascript 复制代码
emitter.on('change', () => {
    console.log('change')
})
emitter.emit('change')

即时销毁

javascript 复制代码
created() {
    emitter.on('change', this.fn)
},
beforeUnmount() {
    emitter.off('change', this.fn)
}
相关推荐
じ☆冷颜〃2 小时前
分布式系统中网络技术的演进与异构融合架构(HFNA)
笔记·python·物联网·设计模式·架构·云计算
西幻凌云20 小时前
认识设计模式——工厂模式
c++·设计模式·简单工厂模式·抽象工厂模式·工厂模式
崎岖Qiu20 小时前
【设计模式笔记24】:JDK源码分析-Comparator中的「策略模式」
java·笔记·设计模式·jdk·策略模式
崎岖Qiu20 小时前
【设计模式笔记23】:长文解析-深刻理解「装饰器模式」
java·笔记·设计模式·装饰器模式
阿波罗尼亚2 天前
Head First设计模式(十四) 设计原则 其他的模式
设计模式
山风wind2 天前
设计模式-责任链模式:让请求在链条中流动直到被处理
设计模式·责任链模式
invicinble2 天前
设计模式全局预览,以及为什么会
设计模式
小股虫2 天前
让系统“杀不死”:同步与异步场景下的弹性设计模式手册
分布式·微服务·设计模式·架构·团队建设·方法论
山风wind2 天前
设计模式:状态模式详解-让对象的行为随状态改变而改变
设计模式·状态模式
__万波__2 天前
二十三种设计模式(十八)--中介者模式
java·设计模式·中介者模式