美文网首页深究JavaScript
理解Observer(观察者模式)

理解Observer(观察者模式)

作者: 收纳哥斯拉 | 来源:发表于2020-02-02 15:21 被阅读0次

参考文章:参考原文链接

概念

观察者模式广泛应用于JS中。observer观察者是一个集合(collections),当状态有变化的时候,观察者通知集合下的对象相应的改变状态。举例说明这个概念。

概念图

代码实例

想象一下你有多个元素,他们需要同时更新内容当一些事件状态发生改变(例如:input中键入文字)。 他们既可以订阅观察者发送的通知,也可以取消观察者发送的通知。 可以在线玩一玩有需要可下载源代码

// define a class
class Observable {
  // each instance of the Observer class
  // starts with an empty array of things (observers)
  // that react to a state change
  constructor() {
    this.observers = [];
  }

  // add the ability to subscribe to a new object / DOM element
  // essentially, add something to the observers array
  subscribe(f) {
    this.observers.push(f);
  }

  // add the ability to unsubscribe from a particular object
  // essentially, remove something from the observers array
  unsubscribe(f) {
    this.observers = this.observers.filter(subscriber => subscriber !== f);
  }

  // update all subscribed objects / DOM elements
  // and pass some data to each of them
  notify(data) {
    this.observers.forEach(observer => observer(data));
  }
}

The usecase example goes like this…

// some DOM references
const input = document.querySelector('.js-input');
const p1 = document.querySelector('.js-p1');
const p2 = document.querySelector('.js-p2');
const p3 = document.querySelector('.js-p3');

// some actions to add to the observers array
const updateP1 = text => p1.textContent = text;
const updateP2 = text => p2.textContent = text;
const updateP3 = text => p3.textContent = text;

// instantiate new Observer class
const headingsObserver = new Observable();

// subscribe to some observers
headingsObserver.subscribe(updateP1);
headingsObserver.subscribe(updateP2);
headingsObserver.subscribe(updateP3);

// notify all observers about new data on event
input.addEventListener('keyup', e => {
  headingsObserver.notify(e.target.value);
});

结果页

我还是想说一下为什么要了解它

其实随着Vue和React这些响应式框架的流行,observer设计模式已经不太需要自己去写原生代码了,但是对原生代码会告诉你一些第一性原则,比如:

  1. observer的本质是collection
  2. 如果observer是collection那么它也可以是iterator

那么接下来UI events它的处理模式竟然也可以用iterator来处理,瞬间有了一种天灵盖被钻孔的感觉。这可以更好的消除代码中的bug,提高质量和效率。

想要了解更多可以参考 --> “Learning JavaScript Design Patterns” by Addy Osmani

相关文章

  • 浅谈iOS KVO键值观察者模式

    一、个人理解 KVO : (Key - Value - Observer) 键值观察者,是观察者设计模式的一种具体...

  • Android观察者模式的理解

    观察者模式理解 观察者模式 Observer 观察者模式定义了一个一对多的依赖关系,让多个观察者对象同时监听一个主...

  • Java 观察者模式

    Java 观察者模式,也可以叫做Publish/Subscribe模式。简单理解,多个Observer可以订阅一个...

  • Android 开发--观察者模式

    观察者 模式 有两个 角色,观察者observer ,被观察者observable。 Observer 是个接口,...

  • Typescript 观察者模式(Observer)

    标签: 前端 设计模式 观察者模式 typescript observer 请仔细阅读下面代码,理解其中的设计理念...

  • 设计模式之观察者模式

    观察者模式 Observer Intro 观察者模式又叫做 发布订阅(Publish/Subscribe)模式,观...

  • 行为型模式——观察者模式

    观察者模式定义 观察者模式(Observer),又叫发布-订阅模式(Publish/Subscribe),定义对象...

  • c++观察者模式

    1.观察者模式简介    观察者模式(Observer),又叫发布-订阅模式(Publish/Subscribe)...

  • 面試小記

    1:设计模式 观察者模式observer observerble,subscribe (订阅) (1)观察者对象 ...

  • 观察者模式

    观察者模式 观察者模式的定义 观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/s...

网友评论

    本文标题:理解Observer(观察者模式)

    本文链接:https://www.haomeiwen.com/subject/wrlqxhtx.html