前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >发布订阅模式与观察者模式

发布订阅模式与观察者模式

作者头像
wade
发布2020-04-23 16:24:53
4290
发布2020-04-23 16:24:53
举报
文章被收录于专栏:coding个人笔记coding个人笔记

在开始敲代码之后,设计模式已经听了很多,总有一个感觉,这是很高大上的东西。其实设计模式不只是代码开发在使用,设计模式是一种思想,适用与任何方面。

设计模式高尚一点的说法是:软件设计过程中针对特定问题的简洁优雅的解决方案,简单理解就是:某种场合下针对某个问题的一种解决方案。一定要明白,设计模式并不是直接用来完成代码编写,是一种思想,不是一种死的机制。不同语言对于相同的设计模式有不同的实现方法,也有可能并不适用。

我们可能在平时的开发中不知不觉就用上了设计模式,只是我们自己都不清楚,而设计模式也一直在发展,现在已经得到认可的模式有24种,还有很多模式也被提出,只是还需要时间的检验。

观察者模式(Observer Pattern):

一种一对多的依赖关系,当一个对象发生改变,所有依赖这个对象的都将得到通知,并更新。观察者直接订阅主题,当主题发生变更,直接通知观察者。

发布订阅模式(Publish/Subscribe Pattern):

起初发布订阅模式也叫观察者模式的别名,慢慢的独立成一个不同的设计模式。订阅者把想订阅的事件注册到中间代理,发布者发布事件到中间代理,由中间代理统一发送给订阅者。

观察者模式的观察者相当于发布订阅模式的订阅者,两者的最大区别就是发布订阅模式有了一个中间机制。观察者模式当对象状态发生改变,直接通知观察者,所以对象和观察者是松散的耦合在一起的,而且是同步实现。而发布订阅模式不需要有任何关联,是完全解耦的,都是通过中间机制进行通信,两者是完全分离的,所以也是异步实现。

先上一个观察者模式的代码:

代码语言:javascript
复制
function User(name, age) {
    this.name = name;
    this,age = age;
    this.list = [];
}
User.prototype.subscribe = function (target) {
  console.log(this.name + '订阅了:' + target.name);
  target.list.push({target: target.name,user: this.name});
}
User.prototype.publish = function () {
  console.log(this.name + '发布了一条消息');
  this.list.forEach((item) => {
    console.log('订阅了' + item.target + '的' + item.user + '收到了这条消息');
  });
}
var user1 = new User('用户1', 18);
var user2 = new User('用户2', 28);
var user3 = new User('用户3', 38);
user1.subscribe(user3, user1.name);
user2.subscribe(user3, user2.name);
user3.publish();
//用户1订阅了:用户3
//用户2订阅了:用户3
//用户3发布了一条消息
//订阅了用户3的用户1收到了这条消息
//订阅了用户3的用户2收到了这条消息

这就是观察者模式,观察者关联了目标对象(user3),当目标对象发布消息的时候,会通知给观察者。

订阅发布模式:

代码语言:javascript
复制
var Mit = {
  typeList: Object.create(null),
  subscribe: function (type, user) {
    if(!this.typeList[type]){
      this.typeList[type] = [];
    };
    this.typeList[type].push({type:type, user: user});
  },
  publish: function (type, user) {
    if(this.typeList[type]){
      for(let item of this.typeList[type]){
         console.log(item.user.name + '接收到了' + user.name + '发布的' + item.type + '类型新闻');
       }
    }
  }
}
function User(name) {
    this.name = name;
}
User.prototype.publish = function (type, user) {
  console.log(this.name + '用户' + '发布了' + type + '类型的新闻');
  Mit.publish(type, user);
}
User.prototype.subscribe = function (type, user) {
    console.log(this.name + '用户' + '订阅了' + type + '类型的新闻');
    Mit.subscribe(type, user);
}
var user1 = new User('user1');
var user2 = new User('user2');
var user3 = new User('user3');
user1.subscribe('type1', user1);
user2.subscribe('type2', user2);
user3.publish('type1', user3);
//user1用户订阅了type1类型的新闻
//user2用户订阅了type2类型的新闻
//user3用户发布了type1类型的新闻
//user1接收到了user3发布的type1类型新闻

有一个中间代理机制,用户之间只存在发布和订阅。

这只是最简单的两个模式,关于订阅发布模式有个很容易让人明白的例子,就算售楼的例子,感兴趣的可以去查看看。

其实观察者模式和发布订阅模式到底是不是同一个的问题,出现了很大的争议,关键在于你怎么区分设计模式了,是看设计意图还是设计结构。如果从结构上看,绝对是不一样的,如果是意图上看,又是一样的。

对于观察者模式和发布订阅模式大概就理解到这样的程度了,至于怎么在编程中使用,就有待商榷了。

(完)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 coding个人笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档