js设计模式--行为型--观察者模式

  行为型:观察者模式

  观察者模式:定义一种一对多的依赖关系,让多个观察者对象同时监听某一个对象,当这个目标对象的状态发生改变时,会通知所有的观察者对象,使它们自动更新。

  使用:一个对象(目标对象)的状态发生改变,所有依赖对象(观察者对象)都将得到广播通知。

  方式:使用面向对象技术,将这种依赖关系弱化。

  案例:如有一个聊天群,里面有产品经理,前端,后端,UI,产品经理会把需求发到群里,然后@所有人,这个过程就是观察者模式。

  1 /**
  2  * 观察者模式
  3  **/
  4 // 定义 基础 发布者类
  5 class Publisher {
  6   constructor() {
  7     this.observers = [];
  8     console.log("Publisher 初始化");
  9   }
 10   // 增加订阅者
 11   add(observer) {
 12     console.log("新增订阅者");
 13     this.observers.push(observer);
 14   }
 15   // 移除订阅者
 16   remove(observer) {
 17     console.log("移除订阅者");
 18     this.observers.forEach((item, i) => {
 19       if (item === observer) {
 20         this.observers.splice(i, 1);
 21       }
 22     });
 23   }
 24   // 通知订阅者
 25   notify() {
 26     console.log("通知订阅者");
 27     this.observers.forEach((observer) => {
 28       observer.update(this);
 29     });
 30   }
 31 }
 32 
 33 // 定义 基础 订阅者类
 34 class Observer {
 35   constructor() {
 36     console.log("初始化订阅者");
 37   }
 38   update() {
 39     console.log("更新订阅者");
 40   }
 41 }
 42 
 43 // 定义具体的 发布类
 44 class PrdPublisher extends Publisher {
 45   constructor() {
 46     /** super
 47      * 表示父类的构造函数,用来新建父类的this对象。
 48      * 在子类的构造函数中,只有调用super之后,才可以使用this关键字,
 49      * 否则会报错。这是因为子类实例的构建,是基于对父类实例加工,只有super方法才能返回父类实例。
 50      * */
 51     super();
 52     // 初始化
 53     this.prdState = null;
 54     this.observers = [];
 55     console.log("具体的发布类,初始化");
 56   }
 57   //获取当前的 prdState
 58   getState() {
 59     console.log("获取当前 prdState");
 60     return this.prdState;
 61   }
 62   // 改变 prdState 的值
 63   setState(state) {
 64     console.log("改变 prdState");
 65     // prd的值发生改变
 66     this.prdState = state;
 67     // 需求文档变更,立刻通知所有开发者
 68     this.notify();
 69   }
 70 }
 71 
 72 // 定义具体的 观察者
 73 class DevObserver extends Observer {
 74   constructor() {
 75     super();
 76     this.prdState = {};
 77     console.log("初始化 观察者");
 78   }
 79   // 具体的更新方法
 80   update(publisher) {
 81     // 更新
 82     this.prdState = publisher.getState();
 83     // 调用工作函数
 84     this.work();
 85   }
 86   work() {
 87     // 具体的业务方法
 88     console.log("具体业务方法");
 89   }
 90 }
 91 
 92 // 创建订阅者:前端开发李雷
 93 const liLei = new DevObserver();
 94 const A = new DevObserver();
 95 const B = new DevObserver();
 96 // 韩梅梅出现了
 97 const hanMeiMei = new PrdPublisher();
 98 // 需求文档出现了
 99 const prd = {
100   // 具体的需求内容
101 };
102 // 韩梅梅开始拉群
103 hanMeiMei.add(liLei);
104 hanMeiMei.add(A);
105 hanMeiMei.add(B);
106 // 韩梅梅发送了需求文档,并@了所有人
107 hanMeiMei.setState(prd);

  观察者模式和发布-订阅者模式的区别?

  相同:在核心思想,运行机制没有本质的差别。

  不同:发布者直接触及到订阅者的操作,叫做观察者模式。

       发布者不直接触及到订阅者,而是由统一的第三方来完成实际的通信操作,叫做发布-订阅者模式。

原文地址:https://www.cnblogs.com/Sabo-dudu/p/14681662.html