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

Unity采样器过多导致URP默认的Lit.Shader报错(shader error in ‘universal render pipeline/lit’: maximum ps_4_0 samp) Shader中多个Sample Texture2D,Sample Texture3D或者类似节点的使用,该类节点都需要一个采样器,如果Shader使用超过了16个纹理采样器,如多个Base Color,Normal Map等,就容易超出。是因为每种Shader Model和GPU都有一个对纹理采样器数量的限制,是因为每个采样器都需要在显卡占用一个独立的寄存器,而寄存器的数量是有限的,当超过限制,显卡无法分配更多的寄存器给新的采样器,因此会导致编译错误。2.什么原因导致纹理采样器超出16个? 阅读详情

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

Observer 模式应该可以说是应用最多、影响最广的模式之一,因为 Observer 的一个实例 Model/View/Control( MVC) 结构在系统开发架构设计中有着很重要的地位和意义, MVC实现了业务逻辑和表示层的解耦。在 MFC 中, Doc/View(文档视图结构)提供了实现 MVC 的框架结构。在 Java 阵容中, Struts 则提供和 MFC 中 Doc/View 结构类似的实现 MVC 的框架。另外 Java 语言本身就提供了 Observer 模式的实现接口。当然, MVC 只是 Observer 模式的一个实例。 Observer 模式要解决的问题为: 建立一个一( Subject)对多( Observer) 的依赖关系, 并且做到当“一” 变化的时候, 依赖这个“一”的多也能够同步改变。

在GOF的《设计模式:可复用面向对象软件的基础》一书中对观察者模式是这样说的:**定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。当一个对象发生了变化,关注它的对象就会得到通知;这种交互也称为发布-订阅(publish-subscribe)。**目标是通知的发布者,它发出通知时并不需要知道谁是它的观察者。

最常见的一个例子就是: 对同一组数据进行统计分析时候, 我们希望能够提供多种形式的表示 (例如以表格进行统计显示、柱状图统计显示、百分比统计显示等)。这些表示都依赖于同一组数据, 我们当然需要当数据改变的时候, 所有的统计的显示都能够同时改变。 Observer 模式就是解决了这一个问题。

UML类图:

在这里插入图片描述
Subject(目标)
——目标知道它的观察者。可以有任意多个观察者观察同一个目标;
——提供注册和删除观察者对象的接口。

Observer(观察者)
——为那些在目标发生改变时需获得通知的对象定义一个更新接口。

ConcreteSubject(具体目标)
——将有关状态存入各ConcreteObserver对象;
——当它的状态发生改变时,向它的各个观察者发出通知。

ConcreteObserver(具体观察者)
——维护一个指向ConcreteSubject对象的引用;
——存储有关状态,这些状态应与目标的状态保持一致;
——实现Observer的更新接口以使自身状态与目标的状态保持一致。

观察者模式按照以下方式进行协作:

1、当ConcreteSubject发生任何可能导致其观察者与其本身状态不一致的改变时,它将通知它的各个观察者;
2、在得到一个具体目标的改变通知后,ConcreteObserver对象可向目标对象查询信息。ConcreteObserver使用这些信息以使它的状态与目标对象的状态一致。

以下是调用时序图:
在这里插入图片描述
适用场合

在以下任一情况下都可以使用观察者模式:

1、当一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立的改变和复用;
2、当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变;
3、当一个对象必须通知其它对象,而它又不能假定其它对象是谁;也就是说,你不希望这些对象是紧密耦合的。

#include <iostream>
#include <list>

using namespace std;

class Subject;

class Observer 
{
public:
    virtual void Update(int) = 0;
    virtual ~Observer(){};
};

class ConcreteObserver : public Observer 
{
public:
    ConcreteObserver(Subject* pSubject):
        m_pSubject(pSubject)
    {  }

    void Update(int value)
    {
        cout << "ConcreteObserver get the update. New state: " << value << endl;
    }

private:
    Subject* m_pSubject;
};

class ConcreteObserver2 : public Observer 
{
public:
    ConcreteObserver2(Subject* pSubject):
        m_pSubject(pSubject)
    {  }

    void Update(int value)
    {
        cout << "ConcreteObserver2 get the update. New state: " << value << endl;
    }

private:
    Subject* m_pSubject;
};

class Subject
{
public:
    virtual void Attach(Observer *) = 0;
    virtual void Detach(Observer *) = 0;
    virtual void Notify() = 0;
    virtual ~Subject(){};
};

class ConcreteSubject : public Subject 
{
public:
    void Attach(Observer* pObserver);
    void Detashi'lch(Observer* pObserver);
    void Notify();

    void SetState(int state)
    {
        m_iState = state;
    }
private:
    std::list<Observer*> m_ObserverList;
    int m_iState;
};

void ConcreteSubject::Attach(Observer* pObserver)
{
    m_ObserverList.push_back(pObserver);
}

void ConcreteSubject::Detach(Observer* pObserver)
{
    m_ObserverList.remove(pObserver);
}

void ConcreteSubject::Notify()
{
    list<Observer*>::iterator it = m_ObserverList.begin();
    while(it != m_ObserverList.end())
    {
        (*it)->Update(m_iState);
        ++it;
    }
}

int main(int argc,char **argv)
{
    //Create Subject
    ConcreteSubject* pSubject = new ConcreteSubject();

    //Create Observer
    Observer* pObserver = new ConcreteObserver(pSubject);
    Observer* pObserver2 = new ConcreteObserver2(pSubject);

    //change the state
    pSubject->SetState(2);

    //Register the observer
    pSubject->Attach(pObserver);
    pSubject->Attach(pObserver2);

    pSubject->Notify();

    //Unregister the Observer
    pSubject->Detach(pObserver);

    pSubject->SetState(3);
    pSubject->Notify();

    delete pObserver;
    delete pObserver2;
    delete pSubject;
    return 0;
}

示例代码2:

在这里插入图片描述
这里的目标 Subject 提供依赖于它的观察者 Observer 的注册( Attach) 和注销( Detach)操作,并且提供了使得依赖于它的所有观察者同步的操作( Notify)。 观察者 Observer 则提供一个 Update 操作, 注意这里的 Observer 的 Update 操作并不在 Observer 改变了 Subject 目标状态的时候就对自己进行更新, 这个更新操作要延迟到 Subject 对象发出 Notify 通知所有Observer 进行修改(调用 Update)。

#include <iostream>
#include <string>
#include <list>

using namespace std;

class Subject;
class Observer
{
protected:
    string name_;
    Subject* pSub_;
public:
    Observer(string name, Subject* pSub)
        : name_(name), pSub_(pSub)
    {  }
    
    virtual void update() = 0;
    virtual ~Observer(){};
};

class StockObserver : public Observer
{
    public:
        StockObserver(string name, Subject* pSub)
            : Observer(name, pSub)
        {  }

        void update();
};

class NBAObserver : public Observer
{
    public:
        NBAObserver(string name, Subject* pSub)
            : Observer(name, pSub)
        {  }

        void update();
};

class Subject
{
protected:
    list<Observer*> observers;
public:
    string action;
    virtual void attach(Observer*) = 0;
    virtual void detach(Observer*) = 0;
    virtual void notify() = 0;
    virtual ~Subject(){};
};

class Secretary : public Subject
{
public:
    void attach(Observer *observer);
    void detach(Observer *observer);
    void notify();
};

void Secretary::attach(Observer *observer)
{
    observers.push_back(observer);
}

void Secretary::detach(Observer* observer)
{
    list<Observer*>::iterator iter = observers.begin();
    while(iter != observers.end())
    {
        if((*iter) == observer)
        {
          iter =  observers.erase(iter);     //focus on this
        }
        else
        {
            ++iter;
        }
    }
}

void Secretary::notify()
{
    list<Observer*>::iterator iter = observers.begin();
    while(iter != observers.end())
    {
        (*iter)->update();
        ++iter;
    }
}

void StockObserver::update()
{
    cout << name_ << " 收到消息:" << pSub_->action << endl;
    if(pSub_->action == "梁所长来了")
    {
        cout << "我马上关闭股票,装做很认真工作的样子!" << endl;
    }
}

void NBAObserver::update()
{
    cout << name_ << " 收到消息:" << pSub_->action << endl;
    if(pSub_->action == "梁所长来了")
    {
        cout << "我马上关闭NBA,装做很认真工作的样子!" << endl;
    }
}

int main(int argc,char **argv)
{
    Subject *dwq = new Secretary(); //创建观察者<br>    //被观察的对象
    Observer *xs = new NBAObserver("xiaoshuai", dwq);
    Observer *zy = new NBAObserver("zouyue", dwq);
    Observer *lm = new StockObserver("limin", dwq);
    //加入观察队列
    dwq->attach(xs);
    dwq->attach(zy);
    dwq->attach(lm);
    dwq->action = "去吃饭了!";      //通知
    dwq->notify();
    cout << endl;
    dwq->action = "梁所长来了";
    dwq->notify();
    return 0;
}

三维重建(十三)——多视角重建 本文综述了多视角三维重建技术,涵盖静态和动态场景的重建方法。介绍了从图像获取到纹理映射的SFM流程,以及非刚性重建(NRSFM)的挑战和解决方案。重点探讨了基于可微渲染的重建方法,以及数据采集策略、相机标定和同步技术。文章还讨论了如何用单视角相机模拟多视角重建,总结了关键技术和未来研究方向。 阅读详情

相关推荐

ST7102驱动移植与调试实战

本文详细介绍了在君正T40平台上移植和调试ST7102 LCD驱动芯片的实战经验。内容涵盖硬件接口配置、时序参数调整、寄存器初始化序列编写及常见问题解决,重点解析了ST7102单芯片集成显示与触控功能的特性,为嵌入式设备显示驱动开发提供实用指南。

k6l7m8n9的博客 1413

【C++】—— 观察者模式

观察者模式详解

m0_56069910的博客 2648

EMQX 结合MySQL实现精细化ACL权限管理实战

本文详细介绍了如何通过EMQX结合MySQL实现精细化的ACL权限管理,提升物联网设备接入和消息传输的安全性。内容包括环境准备、基础配置、权限规则设计技巧以及高级应用与性能优化方案,帮助开发者快速掌握动态生效、便于管理的权限控制方法。

weixin_28683689的博客 197

C++设计模式——观察者模式(Observer Pattern)

C++设计模式——观察者模式(Observer Pattern) 微信公众号:幼儿园的学霸 目录 文章目录C++设计模式——观察者模式(Observer Pattern)目录前言定义代码示例总结观察者模式和中介模式优缺点适用场景及应用示例参考资料 前言 观察者模式面向的需求是:A对象(观察者)对B对象(被观察者)的某种变化高度敏感,需要在B变化的一瞬间做出反应。举个例子,新闻里喜闻乐见的警察抓小偷,警察需要在小偷伸手作案的时候实施抓捕。在这个例子里,警察是观察者、小偷是被观察者,警察需要时刻盯着小偷的一

leonardohaig的博客 1万+

APK静态分析(取证角度)——理论部分

APP是指应用程序(Application),是指能够在手机、平板电脑、电脑等移动设备上运行的软件。APP可以帮助用户进行各种功能操作,如社交媒体、游戏、购物、学习、工作等。用户可以通过应用商店或者在线下载安装APP,然后在设备上使用它们。APP的种类非常丰富,能够满足用户不同的需求和兴趣。

currify的博客 3208

【QT】QtCreator卸载与安装(非正常状态)

QtCreator卸载与安装(非正常状态)

Cappuccino Blog 1万+

C++ 设计模式——观察者模式

观察者模式(Observer Pattern)是一种常用的设计模式,属于行为型模式。它定义了一种一对多的依赖关系,使得当一个对象(主题)状态发生变化时,所有依赖于它的对象(观察者)都会得到通知并自动更新。

慢慢记录,慢慢更新。 3145

C#实现网络寻路(附完整源码)

C#实现网络寻路(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 423

C++设计模式(5)——观察者模式

C++ 观察者模式

伍粟的博客 4025

注意力机制篇 | YOLOv8改进之在C2f模块添加EMA注意力机制(附2种改进方法)

EMA(Exponential Moving Average)注意力机制是一种用于增强模型性能的注意力机制,它通过对模型的特征图进行加权平均来提取更有用的特征信息。具体来说,EMA注意力机制通过引入一个权重因子来调整特征图中每个位置的重要性,从而使模型能够更好地关注重要的特征。🌈

小哥谈 4180

OpenClaw人人养虾:接入Synology Chat

Synology Chat 是群晖 NAS(Network Attached Storage,网络附属存储)内置的即时通讯应用。

王国平的博客 780

C++设计模式——观察者模式

观察者模式:当一个对象状态更新时,会自动通知依赖它的对象。

zhangchuan7758的博客 3464

《Java开发及前端最全面试题-Offer直通车》目录

Java开发是需求最广,工资高的细分领域,同时也是会的人最多,有的公司招1个Java开发,要面试几十甚至上百面试者,同时要求很高,要求通晓技术栈很多及很深深度。如果你正准备面试,想要脱颖而出,那么《Java开发及前端最全面试题-Offer直通车》是你的不二选择。本书汇集了多篇超过1万字的精华内容,无论是Java基础、数据库、SpringBoot和SpringCloud等必问的,还是前端、k8s等容器和虚拟化和大数据各类技术面试,本书都为你提供了最全面的试题和参考答案。

大模型大数据攻城狮的专栏 1178

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

介绍设计模式之观察者模式

翟天保的博客 1万+

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

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

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

设计模式回顾——观察者模式(C++)

观察者模式(Observer Pattern),指的是定义一种“一对多”的依赖关系,使得多个观察者对象同时监听某一主题对象,在主题对象的状态发生变化时,通知所有依赖该对象的观察者。

只要思想不滑坡,想法总比问题多。 1372

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

设计模式之观察者模式实例(c++)

观察者模式 定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆可得到通知并被自动更新。 观察者模式又叫做发布-订阅(Publish-Subscribe)模式、模型-视图(Model-View)模式、源-监听器(Source-Listener)模式。 观察者模式实例之猫、狗与老鼠 从类图可知, MySubject需要保存(关联)MyObserver的对象,当...

Sincky的博客 2170

设计模式之观察者模式(c++)

原地址:https://www.cnblogs.com/carsonzhu/p/5770253.html Observer 模式应该可以说是应用最多、影响最广的模式之一,因为 Observer 的一个实例 Model/View/Control( MVC) 结构在系统开发架构设计中有着很重要的地位和意义, MVC实现了业务逻辑和表示层的解耦。在 MFC 中, Doc/View(文档视图结构)提供了...

wang13342322203的博客 193

设计模式(c++) 观察者模式

#include <iostream> #include <vector> using namespace std; class Observer { private : int x,y; public : void Update(int x,int y) { this->x = x; this->y = y; } void Print() { cout << "x...

qq_43437044的博客 689

设计模式--观察者模式(C++)

一、什么是观察者模式     Observer模式也叫观察者模式,是由GoF提出的23种软件设计模式的一种。Observer模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。  观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事

始则转俗成真,终乃回真向俗! 2829

设计模式学习——观察者模式(c++)

说明:本文主要是代码。主要内容包含下面三点。 一,测试函数调用 二,头文件(.h)内容 三,源码(.cpp)内容 正文 一,测试函数调用方法 #include "observer.h" //引入头文件 int main() { testObeserver();//在main函数中调用测试函数 } 测试函数内容如下: void testOb...

dezhenqiao7326的博客 200

设计模式(C++)详解——观察者模式(Observer)(1)

本文深入解析了观察者模式(Observer),从设计模式的历史背景到现代C++实现。观察者模式用于建立对象间一对多的依赖关系,当主题状态变化时自动通知所有观察者。文章首先介绍了模式的核心概念与MVC架构中的关键作用,然后探讨了设计考量,包括解耦性、生命周期管理和性能权衡。最后通过股票监控系统案例,展示了如何使用现代C++(shared_ptr/weak_ptr)实现安全的观察者模式,解决传统指针方案中的悬空指针问题。该模式广泛应用于需要事件通知的场景,如GUI系统、实时数据监控等。

weixin_42108533的博客 1143

设计模式----观察者模式(C++)

https://www.cnblogs.com/sld6 假设一个数据有三个部分显示数据的, 分别是 max, min,average,我们可以写下这个一个类: 1 class Datashow 2 { 3 public: 4 void measurmentChanged 5 { 6 float temp = getTemplate(); 7 float humidity ...

Mike.Song的专栏 223

常见设计模式-观察者模式(C++)

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。当一个对象发生了变化,关注它的对象就会得到通知;这种交互也称为发布-订阅(publish-subscribe)。目标是通知的发布者,它发出通知时并不需要知道谁是它的观察者。 在以下任一情况下都可以使用观察者模式: 1、当一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立的改变和复用; 2、当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变

weixin_39318565的博客 189
上一篇: 多态内容:虚函数、纯虚函数、抽象类、虚析构函数、虚拟继承
下一篇: leetcode 33 Search in Rotated Sorted Array
不会code的菜鸟
博客等级 码龄9年 208粉丝 200原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值