当前位置: 首页 >  网技达人 >  行为型:观察者模式

行为型:观察者模式

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

定义

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

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


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

特征:

  1. 1. 一个目标者对象 Subject,拥有方法:添加、删除、通知 Observer;
    1. 多个观察者对象 Observer,拥有方法:接收 Subject 状态变更通知并处理;
    2. 目标对象 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. 发布订阅虽然与观察者模式解决的问题的思路差不多,但是这两个还是有区别的。
内容
  • 最新消息,powershell,10多年的癌症被治好了!
    最新消息,powershell,
    2023-12-10
    问:癌症是指什么?.答:.powershell一直有个特性,它的管道会传递对象,请看:.‘abc’ | ForEach-
  • RocketMQ消费者是如何负载均衡的
    RocketMQ消费者是如何负载
    2023-12-09
    摘要:RocketMQ 支持两种消息模式:集群消费( Clustering )和广播消费( Broadcasting )
  • Three.js教程:对象克隆、复制
    Three.js教程:对象克隆、
    2023-12-08
    推荐:将 NSDT场景编辑器 加入你的3D工具链.其他系列工具: NSDT简石数字孪生.对象克隆.clone()和复制.
  • FlashDuty Changelog 2023-09-07 | 新增深色模式与主题配置
    FlashDuty Change
    2023-12-04
    FlashDuty:一站式告警响应平台,前往此地址免费体验!.FlashDuty.现在已经全面支持了深色模式,这为您提供
  • 喷泉设计与安装
    喷泉设计与安装
    2023-12-21
    喷泉设计与安装.喷泉是园林景观中不可或缺的元素之一,无论是在公园、**还是私人花园中,喷泉都能为环境增添灵动的气息,成为
  • 室外园林景观配套设施制作
    室外园林景观配套设施制作
    2024-01-15
    室外园林景观配套设施制作.产品功能.我们的室外园林景观配套设施制作主要提供定制化的户外景观配套设施,包括花池、凉亭、栏杆
  • 生态景观设计
    生态景观设计
    2023-12-06
    生态景观设计产品介绍.产品功能.我们的生态景观设计产品旨在通过创造自然、宜人的环境,提升人们生活的品质。我们的设计团队将
  • 庭院装饰设计
    庭院装饰设计
    2024-01-15
    庭院装饰设计.产品功能.我们的庭院装饰设计产品旨在为您的庭院增添美丽和舒适的氛围。通过精心设计,我们以各种美丽的植物、花
  • 园林绿化养护服务
    园林绿化养护服务
    2024-01-10
    园林绿化养护服务.产品功能.园林绿化养护服务是一项专业的服务,旨在为客户提供全方位的园林绿化管理和养护服务。我们团队的专
  • 庭院绿化布置
    庭院绿化布置
    2023-12-31
    庭院绿化布置产品介绍.产品功能.庭院绿化布置产品主要用于美化庭院环境,提升居住舒适度,改善空气质量,增加户外活动的乐趣。
  • 园林木艺制作
    园林木艺制作
    2023-12-11
    园林木艺制作.产品功能.园林木艺制作是一种以天然木材为原材料,通过手工制作而成的艺术品,具有装饰、实用和环保的功能。这些
  • 居住区景观设计
    居住区景观设计
    2024-01-05
    居住区景观设计.产品功能.我们的居住区景观设计产品旨在为居住区打造美丽、舒适的室外环境。通过巧妙的植物搭配、精美的景观雕
  • 绿化苗木种植
    绿化苗木种植
    2023-12-06
    绿化苗木种植.产品功能.绿化苗木种植是一种专门用于城市绿化的服务,通过种植各种绿化苗木来改*城市环境,提高空气质量,增加
  • *坪铺设
    *坪铺设
    2023-12-26
    *坪铺设产品介绍.产品功能.*坪铺设是一种可以将草坪种植在地面上的装饰性铺设产品。它可以为室内外的环境增添自然的美感,提