首页 > 其他分享 >观察者模式

观察者模式

时间:2024-03-07 20:46:10浏览次数:18  
标签:observer Observer 对象 观察者 模式 state

定义

观察者模式(Observer Pattern): 定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。观察者模式是一种对象行为型模式。

观察者模式包含两个角色:

  • 主题(Subject):被观察的对象,它维护了一个观察者列表,可以添加、删除观察者,以及通知观察者状态的变化。
  • 观察者(Observer):观察主题的对象,当主题状态发生变化时,它会接收到通知并进行相应的处理。

为什么需要观察者模式

观察者模式的价值在于它可以将主题对象和观察者对象解耦,使得它们可以独立地进行扩展和修改,同时也可以降低代码的耦合度,提高代码的可维护性和可扩展性。

具体来说,观察者模式有以下几个价值:

  • 易于扩展

观察者模式可以在不修改主题对象和观察者对象的情况下,增加新的观察者对象或者新的主题对象,从而实现系统的扩展性。

  • 解耦

观察者模式将主题对象和观察者对象解耦,使得它们可以独立地进行扩展和修改,降低了它们之间的依赖关系,提高了系统的灵活性。

  • 通信

观察者模式通过事件通知的方式,实现了主题对象和观察者对象之间的通信,使得它们可以相互交流和协作,从而实现系统的功能。

总之,观察者模式可以帮助我们更好地组织代码,降低代码的耦合度,提高代码的可维护性和可扩展性,应用广泛,是一种非常有价值的设计模式。

具体实现

class Subject<T> {
  private list: Observer<T>[] = []

  constructor(private _state: T) {

  }

  get state() {
    return this._state
  }

  add(observer: Observer<T>) {
    this.list.push(observer)
  }
  remove(observer: Observer<T>) {
    const index = this.list.findIndex(o => o === observer)
    index > -1 && this.list.splice(index, 1)
  }
  notice() {
    this.list.forEach(observer => {
      observer.update(this)
    })
  }

  changeState(state: T) {
    this._state = state
    this.notice()
  }
}

class Observer<T> {
  constructor(subject: Subject<T>) {
    subject.add(this)
  }

  update(subject: Subject<T>) {
    console.log('update:', subject.state)
  }
}

应用场景

  • DOM事件监听
    常见的如click事件、mouse事件、keyboard事件等,通过addEventListener()方法注册事件,当事件触发时,将自动调用回调函数。
  • Promise对象
    Promise对象可作为一种观察者模式实现异步编程,当Promise对象状态发生改变时,所有订阅者都会得到通知并执行其回调函数。

标签:observer,Observer,对象,观察者,模式,state
From: https://www.cnblogs.com/zhanxinbing/p/18059700

相关文章

  • Java编程--观察者(Observer)设计模式
    观察者设计模式观察者设计模式是一种行为设计模式,允许对象在其状态改变时通知其他依赖对象。它创建了一种发布者(Subject)和订阅者(Observer)之间的依赖关系。这种模式经常用于实现事件处理系统。观察者模式的关键组成部分:Subject(主题):拥有添加和删除观察者的方法,以及通知所有观察......
  • 工作单元(Unit of Work)模式
    概念:在C#中,工作单元(UnitofWork)模式是一种设计模式,它用于在业务事务中协调多个仓储(Repository)的写操作,以保持数据的一致性和事务的完整性。工作单元的核心作用是管理一系列的对象变更(增加、修改、删除等),并通过一个统一的提交操作将这些变更持久化到数据库。这样做的目的是为了确......
  • 单例模式
    1.什么单例模式?确保一个类只有一个实例,并提供一个全局访问点,能够帮助开发者创建一个唯一的实例2.单例模式怎么实现?//单线程//懒汉式,线程不安全publicclassSingleton01{//定义一个静态变量privatestaticSingleton01single;......
  • 单例模式
    classCostFunctionFactory{public:EIGEN_MAKE_ALIGNED_OPERATOR_NEWCostFunctionFactory();staticboost::shared_ptr<CostFunctionFactory>instance(void);ceres::CostFunction*generateCostFunction(constCameraConstPtr&camera,......
  • 【c++八股】手撕单例模式
    懒汉模式classSingleton{public:staticSingleton&Instance(){if(instance_==nullptr)instance_=newSingleton();}returninstance_;}private:Singleton(){}~Singleton(){} //防拷贝 Singleton(c......
  • 工作中常用的6种设计模式
    谈起设计模式,你一定会问?这玩意到底有啥用?我好像没用过也不影响做一个码农。也可能项目中实际用了,但是你不自知。虽然Java设计模式有23种,但是工作中常用的可能并没有那麽多。就像新华字典有多少字,你没必要都学一样。本章我们只谈常用的几种设计模式,通过设计模式的理念、规约、到应......
  • C# 控制台禁用快速编辑模式、在指定行更新文本、注册Ctrl+C事件处理器
    在第三行更新文本 代码如下usingMicrosoft.Win32.SafeHandles;usingSystem;usingSystem.Runtime.InteropServices;usingSystem.Threading;classProgram{[DllImport("kernel32.dll")]staticexternSafeFileHandleGetStdHandle(intnStdHandle);......
  • (续)signal-slot:python版本的多进程通信的信号与槽机制(编程模式)的库(library) —— 强化学
    前文:signal-slot:python版本的多进程通信的信号与槽机制(编程模式)的库(library)——强化学习ppo算法库sample-factory的多进程包装器,实现类似Qt的多进程编程模式(信号与槽机制)——python3.12版本下成功通过测试......
  • 数据挖掘概念与技术 - chapter 6 - 挖掘频繁模式、关联与相关性:基本概念与方法
    ***关联推荐!频繁模式:频繁地出现在数据集中的模式,给出数据集中反复出现的联系。频繁序列模式:如有序购买一系列产品频繁结构模式:如组合购买产品sample购物篮分析:通过发现顾客放入他们购物篮中的商品之间的关联,分析顾客的购物习惯,这种关联度发现可以帮助零售商在哪些商品频繁......
  • 真香定律!我用这种模式重构了第三方登录
    分享是最有效的学习方式。博客:https://blog.ktdaddy.com/老猫的设计模式专栏已经偷偷发车了。不甘愿做crudboy?看了好几遍的设计模式还记不住?那就不要刻意记了,跟上老猫的步伐,在一个个有趣的职场故事中领悟设计模式的精髓吧。还等什么?赶紧上车吧。故事办公室里,小猫托着腮帮对......