zoukankan      html  css  js  c++  java
  • 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);

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

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

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

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

  • 相关阅读:
    windows server 2008 x64 上asp.net 调用 word, excel 出错的解决方式
    在Azure VM上架设Surv-U FTP 服务器
    关于windows event log 的若干记录
    postman-变量/环境/过滤等
    每秒处理10万高并发订单的乐视集团支付系统架构分享
    Chai.js断言库API中文文档【转载】
    SharePoint 2013 如何打包一个应用
    SharePoint 2013 如何获取当前站点对应的“应用目录”中的“适用于SharePoint的应用程序”列表
    一个吊丝android个人开发者的逆袭之路
    开发者说说广告的事
  • 原文地址:https://www.cnblogs.com/Sabo-dudu/p/14681662.html
Copyright © 2011-2022 走看看