设计模式--观察者模式(发布订阅模式)

观察者模式又叫做发布—订阅模式,是我们最常用的设计模式之一。它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知和更新。

观察者模式提供了一个订阅模型,其中对象订阅事件并在发生时得到通知,这种模式是事件驱动的编程基石,它有利益于良好的面向对象的设计。

从上面的话语我们可以得知,观察者模式主要动力是促进形成松散耦合(解耦)。

设计思路:

首先先声明一个观察者对象

// 注册观察者对象
    var Observer = (function (){
      var Omsg = {};
      return {
      // 注册方法
      regist: function (type, fn){
        if (typeof Omsg[type] === ‘undefined‘) {
          // 同一个信号,可以顺序执行多个事件,所以应该是个数组
          Omsg[type] = [];
          Omsg[type].push(fn);
        } else {
          Omsg[type].push(fn);
        }
      },
      // 发布方法
      fire: function (type, args) {
        if (!Omsg[type]) {
          // 该消息没有被注册,直接返回
          return;
        }
        // 定义消息
        var events = {
          type:type, // 消息类型
          args: args || {} //消息携带的数据
        },
        i = 0,
        len = Omsg[type].length;// 事件队列的长度
        for (; i < len; i++){
          // 依次执行事件序列
          Omsg[type][i].call(this, events);
        }
      },
      // 消除方法
      remove: function (type, fn) {
        // 如果消息队列存在
        if (Omsg[type] instanceof Array) {
          var i = Omsg[type].length - 1;
          for (; i >= 0; i--) {
            (Omsg[type][i] === fn) && Omsg[type].splice(i, 1);
          }
        }
      }
    };
    }());

例如我这里举一个留言板发布的案例:

然后再将各不相干的留言板增加,计数事件注册,当点击发布功能,发出‘issue’信号:

      // 变量声明
      var ipt = document.getElementsByClassName(‘js-ipt‘)[0]; // 输入框
      var btn = document.getElementsByClassName(‘js-btn‘)[0]; // 发布按钮
      var num = document.getElementsByClassName(‘js-num‘)[0]; // 计数
      var info = document.getElementsByClassName(‘js-info‘)[0]; // 留言板
      var forbidBtn = document.getElementsByClassName(‘js-forbid‘)[0]; //禁止发布按钮

    // 计数事件
    function Counting () {
      var count = Number(num.innerText);
      count++;
      num.innerText = count;
    }

    // 添加留言事件
    function AddMsg (obj) {
      var pEle = document.createElement(‘p‘);
      pEle.innerText = obj.args.value;
      info.appendChild(pEle);
    }

    // 改变颜色
    function ChangeColor () {
      let num = Math.round(Math.random()*900000 + 100000);
      info.style.background = ‘#‘ + num;
    }

    // 事件注册
    Observer.regist(‘issue‘, AddMsg);
    Observer.regist(‘issue‘, Counting);
    Observer.regist(‘issue‘, ChangeColor);

    // 发布按钮点击
    btn.onclick = function () {
      var value = ipt.value;
      Observer.fire(‘issue‘, {value:value});
      ipt.value = ‘‘;
    };
    // 禁止留言,移除事件
    forbidBtn.onclick = function () {
      Observer.remove(‘issue‘, AddMsg);
      Observer.remove(‘issue‘, Counting);
    };

这样一个发布留言案例就完成了。效果图如下(没有写样式,比较丑):

原文地址:https://www.cnblogs.com/xinsir/p/11282978.html

时间: 2024-12-07 09:10:20

设计模式--观察者模式(发布订阅模式)的相关文章

设计模式--观察者模式(发布/订阅模式)

观察者模式简单实现,在主题中需要存在一个观察者的集合,存在一个 update(),状态改变的时候遍历调用观察者集合中的对象,调用update()方法实现通知.而观察者需要做的就是重写 update() 实现自己的逻辑,然后订阅主题,接收状态的改变信息. 上面说到的观察者模式 会导致每一个观察者都需要实现同一个方法 update(),这在实际开发中是很难实现的,所以可以通过委托事件的方式 ,在主题的集合中 存放的是一个 event 对象.event 包含对象的信息,调用的方法名,用到的参数等信息.

C# 委托和事件 与 观察者模式(发布-订阅模式)讲解 by天命

使用面向对象的思想 用c#控制台代码模拟猫抓老鼠 我们先来分析一下猫抓老鼠的过程 1.猫叫了 2.所有老鼠听到叫声,知道是哪只猫来了 3.老鼠们逃跑,边逃边喊:"xx猫来了,快跑啊!我是老鼠xxx" 一  双向耦合的代码 首先需要一个猫类Cat 一个老鼠类Rat 和一个测试类Program 老鼠类的代码如下 //老鼠类 public class Rat { public string Name { get; set; } //老鼠的名字 public Cat MyCat { get;

[设计模式]观察者模式与订阅模式

在读<设计模式>时,观察者模式一直理解为订阅者/发布者 ,其实这两种模式还是有差异的. 一.观察者模式 相关概念:目标和观察者是基类,目标提供维护观察者的一系列方法,观察者提供更新接口.具体观察者和具体目标继承各自的基类,然后具体观察者把自己注册到具体目标里,在具体目标发生变化时候,调度观察者的更新方法. 二.订阅模式 相关概念:订阅者把自己想订阅的事件注册到调度中心,当该事件触发时候,发布者发布该事件到调度中心(顺带上下文),由调度中心统一调度订阅者注册到调度中心的处理代码. 三.异同点 1

Javascript设计模式之发布-订阅模式

简介 发布-订阅模式又叫做观察者模式,他定义了一种一对多的依赖关系,即当一个对象的状态发生改变的时候,所有依赖他的对象都会得到通知. 回忆曾经 作为一名前端开发人员,给DOM节点绑定事件可是再频繁不过的事情.比如如下代码 document.body.addEventListener('click',function () { alert(2333); },false); document.body.click();//模拟点击事件 这里我们订阅了document.body的click事件,当bo

发布订阅模式 和委托

观察者模式/发布订阅模式:发布者有一个接口,订阅者也有一个接口.发布者中有一个列表  List<Observer> mList = new ArrayList<>();,该列表中存储着所有订阅此发布的订阅者的信息,订阅者接口中有一个方法update,任何订阅者都要实现这个方法.当发布的时候,发布者按照mList中的订阅者进行遍历执行update方法,就可以达到广播的目的. 缺点:方法太多单一,所有的订阅者都需要有相同方法前面的方法.否则实现不了 委托 此时我们把update方法分解

观察者模式与发布订阅模式的区别

观察者模式是软件设计模式的一种.在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察者所提供的方法来实现.此种模式通常被用来实时事件处理系统. 发布/订阅模式(Pub/Sub)是一种消息模式,它有 两个参与者 :  发布者和订阅者 .发布者向 某个信道发布一条消息,订阅者绑定这个信道,当有消息发布至信道时就会 接收到一个通知.最重要的一点是, 发布者和订阅者是完全解耦的,彼此并不知晓对方 的存在.两者仅仅共享一个信道名称. 从定义上可

观察者模式 vs 发布-订阅模式

我曾经在面试中被问道,_“观察者模式和发布订阅模式的有什么区别?” _我迅速回忆起“Head First设计模式”那本书: 发布 + 订阅 = 观察者模式 “我知道了,我知道了,别想骗我” 我微笑着回答:“没有区别,它们是一样的.” 但是面试官笑了,“不,它们不一样.” 我当时的表情: 所以是我错了吗? 之后我回到家打开google查找答案.这篇文章就是我google后的总结. 在深入探讨区别之前,我们先来讨论下“观察者模式”和“发布订阅模式”. 观察者设计模式: 我认为大多数人都会同意观察者模

js 设计模式:观察者和发布订阅模式

总是把这两个当作同一个模式,但其实是不太一样的,现在重温一下. 观察者模式 观察者直接订阅目标,当目标触发事件时,通知观察者进行更新 简单实现 class Observer { constructor(name) { this.name = name; } update() { console.log(`${this.name} update`) } } class subject { constructor() { this.subs = []; } add(observer) { this.

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

最近项目里,写了一个通知服务,具备处理短信.电邮.站内信的能力.但我做多了一点,就是可以通过配置选择它的能力,比如只具备处理短信或者具备点油.站内信的能力. 我画了一个简单的图 图中的 Dispatcher是一个Message的中转器,它负责投递给最终的 SMS.Email.Website处理器处理.但是 Dispatcher里,我使用了硬编码来内置 SMS.Email.Website处理器(尽管我加了些判断,来区别此能力是否开启),但它的耦合太高. 所以能够如何优化呢? 观察者模式 观察者模式