设计模式介绍:观察者模式(observer)

Java中的23个设计模式 【行为型模式】 中的 【观察者模式】 阅读详情




   观察者模式(又称发布/订阅模式)定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,,所有依赖于它的对象都得到通知并被自动更新。

    常见的应用程序框架中有很多观察者模式的应用,比如 MFC 的 Doc/View ,Qt 中的信号与槽、 Model/View Architecture,安卓中的广播接收者( Broadcast Receiver )。

    当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变;当一个对象必须通知其它对象,而它又不能假定其它对象是谁,换言之, 你不希望这些对象是紧密耦合的;……这些场景下都可以使用观察者模式。

    下图是观察者模式的 UML 表示:


    下面提供一个观察者模式的实例。这个实例描述的是这么一个情况:有人想看花,希望花开的时候能够得到通知。

    先看目标和观察者接口的声明:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. class BloomObserver{  
  2. public:  
  3.     BloomObserver();  
  4.     virtual ~BloomObserver();  
  5.     virtual void bloomed() = 0;  
  6. };  
  7. class Rose{  
  8. public:  
  9.     Rose();  
  10.     ~Rose();  
  11.     void attach(BloomObserver *pObserver);  
  12.     void detach(BloomObserver *pObserver);  
  13.     void notify();  
  14.     void setBloomed();  
  15.     bool bloomed();  
  16. private:  
  17.     bool m_bBloomed;  
  18.     BloomObserverList m_observers;  
  19. };  

    再看目标的实现:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. Rose::Rose():m_bBloomed(false)  
  2. {}  
  3. void Rose::attach(BloomObserver *pObserver){  
  4.     m_observers.add(pObserver);  
  5. }  
  6. void Rose::detach(BloomObserver *pObserver){  
  7.     m_observers.remove(pObserver);  
  8. }  
  9. void Rose::notify(){  
  10.     foreach(BloomObserver *observer, m_observers)  
  11.         observer->bloomed();  
  12. }  
  13. void Rose::setBloomed(){  
  14.     m_bBloomed = true;  
  15.     notify();  
  16. }  
  17. bool Rose::bloomed(){  
  18.     return m_bBloomed;  
  19. }  

    接下来是观察者的实现:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. class ObserverA : public BloomObserver{  
  2.     void bloomed(){  
  3.         callFriendsDriveCarToSomewhere();  
  4.     }  
  5. };  
  6.   
  7. class ObserverB : public BloomObserver{  
  8.     void bloomed(){  
  9.         writeBlog();  
  10.     }  
  11. };  
  12.   
  13. class ObserverC : public BloomObserver{  
  14.     void bloomed(){  
  15.         takeCameraToSomewhere();  
  16.     }  
  17. };  

    最后是驱动代码:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. int main(int argc, char**argv){  
  2.     Rose rose;  
  3.     ObserverA *a = new ObserverA;  
  4.     ObserverB *b = new ObserverB;  
  5.     ObserverC *c = new ObserverC;  
  6.     rose.attach(a);  
  7.     rose.attach(b);  
  8.     rose.attach(c);  
  9.   
  10.     //doSomethingHere();  
  11.     rose.setBloomed();  
  12.   
  13.     rose.detach(a);  
  14.     rose.detach(b);  
  15.     rose.detach(c);  
  16.   
  17.     delete a; delete b; delete c;  
  18.     return 0;  
  19. }  


matlab摄像头编程observe函数 该程序能连续地读取本地图像文件、internet上的图像文件,或者捕获摄像头视频,或者捕获屏幕视频,并生成一个avi文件。 立即下载

相关推荐

从SVF文件到高效验证:Formality中set_svf命令的隐藏技巧与实战解析

本文深入解析Formality中set_svf命令的高级应用技巧,涵盖SVF文件生成策略、多文件加载优化及验证效率提升方法。通过-append和-ordered选项的实战应用,帮助工程师解决芯片验证中的常见问题,实现验证通过率与运行效率的双重提升。

mqtt6iot的博客 819

JetBot-Jetcam的使用

1. 下载安装JetCam git clone https://github.com/NVIDIA-AI-IOT/jetcam cd jetcam sudo python3 setup.py install 2. 测试摄像头 2.1 查看摄像头设备 ls -ltrh /dev/video* 2.2 创建相机对象 # csi摄像头 from jetcam.csi_camera import CS...

AI新手程序员 3348

TPS563201DDCR电路翻车实录:从原理图到PCB,我踩过的5个坑及补救方法

本文详细记录了使用TPS563201DDCR电源芯片设计电路时遇到的5个常见问题及解决方案,包括EN引脚配置、BST电容选型、反馈网络设计、PCB布局优化以及散热处理。通过实际案例和数据分析,帮助工程师避免类似错误,提升电源模块的可靠性和效率。

weixin_42532938的博客 528

Unity 相机观察物体

分享一份摄像机观察物体的脚本,改脚本包含,环绕目标旋转,缩放,平移功能,做个记录 using UnityEngine; public class CameraObserve : MonoBehaviour { public static CameraObserve Instance; /// <summary> /// 是否可以旋转 /// </summary> public bool CanMove = false; ///

朝夕的博客 981

AD9361 FIR 滤波器设计

matlab 得到滤波器系数

weixin_44630490的博客 1万+

【技能---ubuntu20.04更换国内镜像源】

安装好ubuntu20.04后,在下载软件等安装包的时候,速度特别的慢,为此就想着更换一下镜像源,以此来增加下载的速度!!!下面是换源的具体流程!!!提示:以下是本篇文章正文内容,下面案例可供参考以上到这里就更换完软件源了,如有不足之处,请大家斧正!!!

fyc300的博客 1万+

pytorch手势识别分类网络的学习记录

resnet手势识别

MT的博客 1736

Hypermesh到Abaqus CEL网格转换全攻略:解决欧拉体导入难题

本文详细解析了Hypermesh到Abaqus CEL网格转换的全流程,重点解决欧拉体导入难题。通过单元类型转换、INP文件编辑和多组件合并技术,实现流固耦合仿真的高效前处理。文章包含实用脚本和工程案例,帮助工程师突破ABAQUS CEL分析中的网格转换瓶颈。

weixin_30832143的博客 189

[Unity实战]相机观察物体

在原有的旋转、缩放的基础上加上了“惯性”。 using UnityEngine; using System.Collections; public class CameraObserve : MonoBehaviour { public Transform targetObj; public float rotateSpeed = 100f; public f

宏哥的博客 2921

Imatest-Star模块(西门子星图)

星图分析指南:基于ISO12233标准的MTF测试方法,通过放射状射线和正弦灰度变化评估相机SFR性能。

weixin_64706696的博客 1565

GitHub 镜像站点

国内访问 GitHub 有时会遇到速度慢或不稳定的情况,这时 GitHub 镜像站点就能帮上忙。它们通过代理或缓存机制,让你更顺畅地浏览仓库、下载资源甚至克隆代码。希望这些信息能帮你更顺畅地访问 GitHub 资源。下面表格汇总了一些常见的镜像站及其主要用途。

BillKu的博客 6万+

设计模式介绍之七:观察者模式(observer)

观察者模式(又称发布/订阅模式)定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新

安晓辉生涯——聚焦程序员的职业规划与成长 9315

数据资产入表——解读100页数据资产入表解读与分析【附全文阅读】

本文档《数据资产入表:解读与分析》面向企业财务、数据管理、法务合规及高管等核心岗位,系统解析数据资产入表全流程。以"政策-实操-价值"为主线,首先解读入表政策要求,明确会计处理规范;其次详细拆解数据盘点、治理、确权、评估等实操步骤,提供行业案例参考;最后分析入表难点及后续运营策略,为企业提供从政策理解到落地执行的一站式解决方案。

cdfunlove的博客 390

设计模式go语言实现----观察者模式Observer

1 定义 观察者模式(Observer):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个柱体对象,这个柱体对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己 UML类图: ...

cloudUncle的博客 880

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Design Model---Observer Model

  昨天看了Head First设计模式这本书,这本书写得真不错,简单易懂。我是第一次接触设计模式,觉得这东西挺高端大气的,和别人侃的时候,我用啥XX设计模式,是不是觉得很屌的感觉?哈哈,开玩笑了,主要是学习前人的经验,这样让自己的代码设计更加规范。现在就记录一下我学到的第一个设计模式---Observer Model 什么是观察者设计模式呢? 举个例子来说,就是报社和报纸...

weixin_30691871的博客 394

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

九、观察者模式(ObServer)

一、什么是观察者模式 观察者模式又叫做发布-订阅(Publish/Subscribe)模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 二、观察者模式角色 1...

chunbixi5712的博客 141

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

设计模式之观察者模式

观察者模式其定义了对象之间的一对多的依赖关系,这样一来,当一个对象改变时他所有的依赖者都会收到通知,并得知后自动更新,好比猎头与求职者的关系,猎头会把求职这的信息添加到自己的人员名单中,当有招聘信息时就会通知名单中所有的人,每个人类似于一个对象,当猎头对象改变时,名单中的每个人都会改变状态。这种观察者模式实线的方式不只有一种,但是包括Subject和Observer接口的类的设计的做法是最常见的。

Cherish__it的博客 277

关于观察者模式中的一些思考

观察者模式是程序设计 经典23种设计模式之一,大致的设计如图: 当Subject 发生特定的状态变化时,就会通知已经订阅了此Subject 的 Observer 那么就会有两种情况: 1.当Subject改变后主动通知定义的观察者Observer 2.观察者Observer 侦测到Subject发生变化,从而触发相应的动作 如果是第一种情况,那订阅者就需要到Subject去注册,然...

weixin_30342827的博客 92

C++设计模式之观察者模式(Observer pattern)

观察者模式: 为对象建立一种“通知依赖”关系,当一个对象(目标对象)的状态发生变化时,所有的依赖对象(观察者对象)都得到通知并自动更新。 观察者模式,又称发布-订阅模式,其所作的工作就是在解除耦合,弱化依赖关系,采用面向对象技术,让耦合的双方都依赖于抽象,而不是依赖于具体,将这二者封装在独立的对象中以使它们可以独立的改变和复用。 观察者模式中的四类角色: 1.Subject(目标):抽象的目标类,提供增加和删除观察者对象的的方法,以及一个抽象的Notify方法(通知机制),目标类可以是接口,也可以是抽象类和

weixin_43086349的博客 266

观察者模式

观察者模式观察者模式核心观察者模式实现使用Javase实现观察者模式观察者模式常见场景 观察者模式核心 观察者模式主要用于1:N的通知。当一个对象(目标对象Subject或Observable)的状态变化时,他需要及时告知一系列对象(观察者对象,Observer),令他们做出响应。 通知观察者的方式: -推:每次都会把通知以广播方式发送给所有观察者,所有观察者只能被动接收 -拉:观察者只要知道有...

LY_yhq 186

What is Observer Pattern?

What is Observer Pattern? * This is a behavioral design pattern.* Observer pattern is used to solve the problem of notifying multipleobjects of a change to keep them in sync like the Model-View-C

mindva的专栏 365

Python设计模式-12-观察者模式

ddd

临渊-测试开发 351

设计模式-第十章-观察者模式

ISubject类,抽象通知者,一般用一个抽象类 或者接口实现。用来增加观察者, 移除观察者,通知IObserver类,抽象观察者,为所有具体观察者定义一个接 口,在得到主题的通知时更新自己 这个接口 叫更新接口Subject类,具体通知者,将有关状态存入具体观察者对象, 在具体通知者的内部状态改变时,给所有登记过的观察者发送通知Observer类,具体观察者类,实现抽象观察者角色所要求的更新接口,以便使本身的状态与通知者状态相协调当你使用图形用户界面类时通常会遇到一个问题。 比如, 你创建了自定义按钮类并

沸腾了的博客 293

Java中的观察者模式

注:基于《Java高并发编程详解-汪文君》、《深入理解JVM高级特性与最佳实践-周志明》,以学习为目的,加上自身理解、验证。作为笔记,为加深印象,做到不复制,不粘贴。欢迎,大家一起交流学习。 观察者模式 又叫做发布-订阅模式。观察者模式定义了一种一对多的依赖关系。使得多个观察对象可以去监听到同一个主题对象,当其状态发生改变时,会通知到所有的观察者。 观察者模式的结构 1.抽象主题...

195

[一天一个设计模式]-[观察者模式]

观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。 观察者模式包含如下角色: Subject: 目标 ConcreteSubject: 具体目标 Observer: 观察者 ConcreteObserver: 具体观察者 举个栗子...

A_yes的博客 333

设计模式 - 行为型设计模式 - 观察者模式(Java)

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net Definition Define a one-to-many dependency between objects so that when one object changes state, all its dependents are no...

了解➔熟悉➔掌握➔精通 6万+
上一篇: 设计模式介绍:模板方法(Template Method)模式
下一篇: UML 工具 UMLet 试用
bamboolsu
博客等级 码龄22年 200粉丝 394原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值