首页 > 其他分享 >行为型:观察者模式

行为型:观察者模式

时间:2023-03-29 23:13:21浏览次数:32  
标签:sub Observer 对象 行为 观察者 模式 data

定义

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

一种一对多的关系中一称为被观察者也叫目标对象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. 发布订阅虽然与观察者模式解决的问题的思路差不多,但是这两个还是有区别的。  

标签:sub,Observer,对象,行为,观察者,模式,data
From: https://www.cnblogs.com/longbensong/p/17270890.html

相关文章

  • C/C++ 思考:策略模式在协议解析中的应用
    目录引出问题传统解析方式策略模式简介UML类图改进1:基于函数的代码结构改进改进2:基于对象的结构改进参考引出问题在基于消息包的通信协议中,通常会通过一个id或命令名来标......
  • 未来没那么"湿",但一定会很"晒":SD模式(二)
    编者按:本文作者为微书架创始人许锡标,此篇文章是探讨SD模式的第二篇,从克莱·舍基的两本书讲起,谈自己对互联网发展的新认识。SD模式就是Share&Discover,各位如果想要就此问题......
  • 非侵入式帮助台指派模式
    ADManagerPlus提供易于使用和安全的独特指派模式。利用其帮助台管理和指派功能,管理员可以授权非管理用户(例如,帮助台技术员、人力资源职员和前线行政人员)执行某些不是必须由......
  • m基于C3D-hog-GRNN广义回归神经网络模型的人员异常行为识别算法的matlab仿真
    1.算法描述      实时的人群异常行为识别是一项极具挑战的工作,具有较高的现实意义和社会需求,快速准确地判断出异常行为并及时预警,一直是我们探索的方向。传统的机器......
  • 低代码平台搭建CRM 加速重构业务模式
    CRM即客户关系管理系统,通过CRM可以有效的管理企业客户数据,帮助企业提升销售业绩以及规范企业企业务流程。客户关系管理不仅仅是一种思想,也是一种管理工具。它的意义是运用......
  • 杨建允:互联网+旅游激发新业态,文旅消费新模式大有可为
      文旅消费年轻化,行业拥抱变化、积极转型  近年来文旅客户越来越年轻化,而部分文旅资源端在营销和运营等方面还沿用着传统的模式,这在一定程度上会降低年轻游客对文旅......
  • PowerBuilder现代编程方法X01:PowerPlume的X模式
     临渊羡鱼,不如退而结网。 PB现代编程方法X01:PowerPlume的X模式 前言PowerPlume是PowerBuilder深度创新的扩展开发框架(免费商用)。它不是一个大而全的类库(取决于你......
  • iOS 深色模式适配
    要求:iOS13.0以上重点:需要所有界面进行适配,工作量巨大,需要从项目开始就进行适配;H5界面无法进行适配 实现方式:SystemColors(常用)、SemanticColors(常用)、DynamicColors(......
  • 第一章 设计模式 - 基础概念
    什么是设计模式1、所谓设计模式就是一种可复用的解决方案,用于解决软件设计中遇到的常见问题。2、所谓设计模式就是在不同业务情况下,要如何去解决问题的一种方案,......
  • 开发者工具调用wx.getLocalImgData无效(无输出),手机调用debug模式无输出?
    转:开发者工具调用wx.getLocalImgData无效(无输出),手机调用debug模式无输出?  1.只能在微信上调用,浏览器无法调用微信接口。2.jweixin-1.0.0.js无法使用getLocalImgData......