行为型:观察者模式

行为,观察者,模式 · 浏览次数 : 203

小编点评

**观察者模式**是一种对象行为模式,定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知并自动更新。 **模式特征:** * **目标者 (Subject):**拥有方法:`addObserver`、`removeObserver`和`notify`。 * **观察者 (Observer):**拥有方法:`update`。 **模式示例:** ```js // 目标对象 Subject class Subject { constructor (data) { this.observers = []; this.data = data; } addObserver (data) { this.observers.push(data); } removeObserver (data) { this.observers = this.observers.filter(t => t !== data); } notify (...data) { this.observers.forEach(observer => observer.update(...data)); } } // 观察者对象 Observer class Observer { constructor (name) { this.name = name; } update (data) { console.log(`${this.name}, 我执行了,${data}发生了变化`); } } // 测试观察者模式 const sub = new Subject('我是被观察') const ob1 = new Observer('我是ob1') const ob2 = new Observer('我是ob2') const ob3 = new Observer('我是ob3') sub.addObserver(ob1) sub.addObserver(ob2) sub.addObserver(ob3) sub.notify('现在开始发送第一个通知') console.log('**************看看ob1 是不是没有收到第二个通知**************') sub.removeObserver(ob1) sub.notify('现在开始发送第二个通知') ``` **总结:** 观察者模式是一种对象行为模式,用于解决对象间存在一对多关系的交互行为。目标者拥有 `addObserver` 和 `removeObserver` 方法,用于添加和删除观察者。观察者拥有 `update` 方法,用于处理观察者的通知。

正文

定义

观察者模式属于行为型模式,它定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新。

一种一对多的关系中一称为被观察者也叫目标对象Subject多则称为观察者对象Observer

观察者模式中通常有两个模型,一个观察者(observer)和一个被观察者(Observed)。从字面意思上理解,即被观察者发生某些行为或者变化时,会通知观察者,观察者根据此行为或者变化做出处理。

特征:

    1. 一个目标者对象 Subject,拥有方法:添加、删除、通知 Observer
    2. 多个观察者对象 Observer,拥有方法:接收 Subject 状态变更通知并处理;
    3. 目标对象 Subject 状态变更时,通知所有 Observer

生活中的例子

  如我们关注了某某订阅号,当订阅号有新的文章时,我们都收到了推文,这个就是最简单的观察者模式。

模拟观察者模式

/*
定义:
观察者模式是一种对象行为模式。
它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

js 没有抽象类、接口 所以一般结构如下:
subject 目标 or 被观察者:
  add: 把观察者注册进来
  remove: 移除观察者
  notify: 遍历注册进来的观察者,调用他们的update

Observer 观察者:
  update: 自己提供的更新方法
*/

// 被观者、目标
class Subject {
  constructor (data) {
    this.observers = []
    this.data = data
  }
  addObserver (data) {
    this.observers.push(data)
  }
  removeObserver (data) {
    this.observers = this.observers.filter(t => t !== data)
  }
  notify (...data) {
     this.observers.forEach(observer => observer.update(...data))
  }
  // 你的业务代码
  setData (data) {
    this.data= data;
    this.notify(data)
  }
}

// 观察者
class Observer {
  constructor (name) {
    this.name = name
  }
  update (data) {
    console.log(`${this.name}, 我执行了,${data}发生了变化`)
  }
}

const sub = new Subject('我是被观察')
const ob1 = new Observer('我是ob1')
const ob2 = new Observer('我是ob2')
const ob3 = new Observer('我是ob3')
sub.addObserver(ob1)
sub.addObserver(ob2)
sub.addObserver(ob3)
sub.notify('现在开始发送第一个通知')
console.log('**************看看ob1 是不是没有收到第二个通知**************')
sub.removeObserver(ob1)
sub.notify('现在开始发送第二个通知')

 小结

  1. 观察者模式用来解决对象之间存在一对多关系的交互行为
  2. 观察者模式中,被观察者与观察者解藕没有很彻底,且在被观察者中观察者要提供统一的更新方法,当然这也是要看具体的应用场景,在某些模块本身就是存在关联,那用观察者模式也没问题。
  3. 发布订阅虽然与观察者模式解决的问题的思路差不多,但是这两个还是有区别的。  

与行为型:观察者模式相似的内容:

行为型:观察者模式

定义 观察者模式属于行为型模式,它定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新。 一种一对多的关系中一称为被观察者也叫目标对象Subject而多则称为观察者对象Observer 观察者模式中通常有两个模型,一个观察者(observer)和

软件设计模式系列之二十一——观察者模式

观察者模式(Observer Pattern)是一种行为型设计模式,它允许对象之间建立一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。这个模式也被称为发布-订阅模式,因为它模拟了一个主题(发布者)与多个观察者(订阅者)之间的关系。观察者模式主要用于实现对象之间...

设计模式学习(十三):观察者模式

设计模式学习(十三):观察者模式 作者:Grey 原文地址: 博客园:设计模式学习(十三):观察者模式 CSDN:设计模式学习(十三):观察者模式 观察者模式 观察者模式是一种行为型模式。在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知。 一般可以用做事件处理

【设计模式】观察者模式

设计模式 【设计模式】工厂方法模式 【设计模式】抽象工厂模式 【设计模式】单例模式 【设计模式】策略模式 【设计模式】观察者模式 一、介绍 观察者模式是一种行为设计模式,当一个对象的状态发生改变时,依赖(观察)它的对象会接收到通知,并进行自动的更新操作。 举例:某公司发布了一款新的手机,性能很强大,

再谈23种设计模式(3):行为型模式(学习笔记)

行为型模式的关注点在于对象之间的通信和职责分配(描述结构模型中对象的动态特征)。行为型模式关注的是对象之间的交云和协作,即它们是如何相互作用的,以及如何分配职责和算法来完成任务。

行为型:策略模式

定义 定义一系列的算法,将他们一个个封装起来,使他们直接可以相互替换。 算法:就是写的逻辑可以是你任何一个功能函数的逻辑 封装:就是把某一功能点对应的逻辑给抽出来 可替换:建立在封装的基础上,这些独立的算法可以很方便的替换 通俗的理解就是,把你的算法(逻辑)封装到不同的策略中,在不同的策略中是互相独

行为型:发布订阅模式

定义 发布订阅模式是基于一个事件(主题)通道,希望接收通知的对象Subscriber (订阅者)通过自定义事件订阅主题,被激活事件的对象 Publisher (发布者)通过发布主题事件的方式通知订阅者 Subscriber (订阅者)对象。 简单说就是发布者与订阅者通过事件来通信,这里的发布者是之前

行为型:迭代器模式

定义 迭代器模式提供一种方法按顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。迭代器模式是目的性极强的模式,它主要是用来解决遍历问题。 es6 中的迭代器 JS原生的集合类型数据结构,有Array(数组)和Object(对象),在ES6中,又新增了Map和Set。四种数据结构各自有着自

软件设计模式系列之二十二——状态模式

状态模式是一种行为型设计模式,它允许对象在内部状态发生改变时改变其行为,使得对象的行为看起来像是改变了其类。状态模式将对象的状态抽象成一个独立的类,让对象在不同状态下具有不同的行为,而且可以在运行时切换状态。这种方式使得状态的管理更加清晰,避免了大量的条件判断语句,提高了代码的可维护性和可扩展性。

软件设计模式系列之二十——备忘录模式

备忘录模式是一种行为型设计模式,它允许我们在不暴露对象内部细节的情况下捕获和恢复对象的内部状态。这个模式非常有用,因为它可以帮助我们实现撤销、恢复和历史记录等功能。在本文中,我们将深入探讨备忘录模式的各个方面,包括定义、示例、结构、实现步骤、代码实现、典型应用场景、优缺点、类似模式以及小结。