首页 > 其他分享 >设计模式--观察者(Observer)模式

设计模式--观察者(Observer)模式

时间:2024-02-27 16:58:00浏览次数:21  
标签:Observer -- 主题 观察者 对象 具体 设计模式

目录


概念

观察者模式(Observer Pattern)是C++中常用的一种设计模式,它定义了对象间的一种一对多的依赖关系。在这种模式中,当一个对象(被观察者,Subject)的状态发生改变时,所有依赖于它的对象(观察者,Observer)都会收到通知并自动更新。

这种模式的结构通常包括四个部分:抽象主题(Subject)、抽象观察者(Observer)、具体主题(ConcreteSubject)和具体观察者(ConcreteObserver)。

  • 抽象主题(Subject):负责维护一个观察者列表,并提供添加、删除和通知观察者的接口。它并不知道具体的观察者是谁,只知道它们都实现了Observer接口。
  • 抽象观察者(Observer):为所有的具体观察者定义一个接口,当得到主题的通知时,进行自我更新。
  • 具体主题(ConcreteSubject):将有关状态存入各具体观察者对象。当具体主题的状态发生任何更改时,通知所有观察者。
  • 具体观察者(ConcreteObserver):实现Observer所要求的更新接口,以便使本身的状态与主题的状态相协调。

观察者模式的优点包括:

  1. 满足“开-闭原则”:新添加的观察者类不需要修改主题类的代码,满足软件设计的开闭原则。
  2. 高内聚、低耦合:被观察者和观察者之间建立一个抽象的耦合,两者可以属于不同的抽象化层次,被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。
  3. 支持广播通讯:被观察者对象可以同时向多个观察者对象传送信息,消息是一对多关系。

然而,观察者模式的一个缺点是没有相应的机制使观察者知道所观察的对象是怎么发生变化的,而只是知道对象发生了变化。

在C++中,观察者模式特别适用于GUI组件编程,允许不同的UI在不与其他对象类耦合的前提下,对逻辑层事件做出不同反应。

请注意,设计模式的选择和使用应根据具体的问题和场景来决定,每种设计模式都有其适用的场景和限制。

标签:Observer,--,主题,观察者,对象,具体,设计模式
From: https://www.cnblogs.com/yubo-guan/p/18037223

相关文章

  • Semantic Kernel 学习笔记:初步体验用 Semantic Memory 生成 Embedding 并进行语义搜索
    SemanticKernel的Memory有两种实现,一个是SemanticKernel内置的SemanticMemory,一个是独立的KernelMemory,KernelMemory是从SemanticKernel进化而来。关于SemanticMemory的介绍(来源):SemanticMemory(SM)isalibraryforC#,Python,andJavathatwrapsdir......
  • 使用Navicat打开加密SQLite数据库
    参考使用Navicat打开加密SQLite数据库_加密的数据库文件怎么打开-CSDN博客1.在Nuget搜索并安装SQLitePCLRaw.bundle_e_sqlcipher2.打开项目所在路径,按照下面的路径找到e_sqlcipher.dll文件(根据安装的Navicat版本选择win-x64或者win-x86)3.打开Navicat的安装目录,该目录下有个sq......
  • 数字IC学习02
    认识和理解IC集成电路可以从多种不同的角度,其中最好最普遍的一种是:抽象层级,即将IC做不同程度的抽象,按照抽象程度从高到底,分别为:系统层算法层寄存器传输层逻辑层电路层每一抽象层级,均可用三种不同的方式去描述,分别为:行为描述物理描述结构描述综合其实就是指从高抽象......
  • 如何创建自己的Spring Boot Starter并为其编写单元测试
    当我们想要封装一些自定义功能给别人使用的时候,创建SpringBootStarter的形式是最好的实现方式。如果您还不会构建自己的SpringBootStarter的话,本文将带你一起创建一个自己的SpringBootStarter。快速入门创建一个新的Maven项目。第三方封装的命名格式是xxx-spring-boo......
  • CNN的进击之路——讲讲ResNet, Inception, ResNeXt和Densenet等常见网络
    前言本文是一篇大杂烩,按照发布时间总结了CNN的一些常见网络。AlexNet(2010)—>VGG(2014)——> GoogLeNetV1(2014)——>ResNet(2015)——>DenseNet(2017)——>MobileNet(2019)https://tobefans.github.io/2020/05/13/resnet/#%E5%89%8D%E8%A8%80AlexNetAlexNet来源于ImageNetClas......
  • 【译】生成式人工智能 - 音频
    原作:马可·兰波尼引言:在生成式人工智能领域,关注的焦点一直放在语言和图像上,但近期在音频领域也取得了许多进展。本文将为您介绍有关生成式音频模型的一切知识。 在过去的十年中,我们见证了人工智能驱动的音频生成技术取得了显著进步,包括音乐和语音合成。然而,直到最近,这些改进仍......
  • 《系统科学方法概论》第四章读后感
    书中第四章节主要讲述了控制方法。首先书中介绍了控制论的历史,控制论的产生主要与两个因素有关,其一是生产自动化趋势的要求,契尔氏计算机技术的促进,具体的历史过程可以分为三个阶段,一是古代控制论思想和实践(主要是关于自动化的思想和实践),而是近代的控制论萌芽(主要是在机械化大生产......
  • python-dotenv模块的使用
    安装模块pip3installpython-dotenv使用方式需要在根路径下新建.env文件,并写入配置importosfromdotenvimportload_dotenvfromdotenvimportdotenv_values###方法一res=load_dotenv()#takeenvironmentvariablesfrom.env#返回True或Falseprint(res......
  • do{}while(0)用法
    更安全的展开宏定义#defineDOSOMETHINGfoo1();foo2();if(condition) DOSOMETHING/*if(condition) foo1();foo2;*/以上代码会导致foo2();始终运行。改为do{}while(0)就可以。do{}while(0)会在任何场景下表现一致。#defineDOSOMETHING\ do{\ foo1()......
  • python 的深浅拷贝
    python的深浅拷贝在Python中,深拷贝(deepcopy)和浅拷贝(shallowcopy)是用于复制数据结构(如列表或字典)的两种不同方式,它们有以下区别:浅拷贝(ShallowCopy):浅拷贝创建一个新的对象,然后将原始对象中的元素(如果是可变对象)复制到新对象中。但是,如果元素本身也是一个可变对象,则新对象中的......