C++设计模式行为型之观察者模式

这篇具有很好参考价值的文章主要介绍了C++设计模式行为型之观察者模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、概述

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

二、示例代码

#include <list>

class Subject;

class Observer
{
public:
    virtual ~Observer();
    virtual void Update(Subject* theChangedSubject) = 0;
protected:
    Observer();
};

class Subject
{
public:
    virtual ~Subject(){}
    virtual void Attach(Observer* o)
    {
        _observers->push_back(o);
    }
    virtual void Detach(Observer* o)
    {
        _observers->remove(o);
    }
    virtual void Notity()
    {
        std::list<Observer*>::iterator it = _observers->begin();
        while (it != _observers->end())
        {
            (*it)->Update(this);
            ++it;
        }
    }
protected:
    Subject();
private:
    std::list<Observer*> *_observers;
};

上述代码是一个简单的观察者设计模式代码,逻辑清晰,但这种不能够通用,只能对特定的观察者才有效,即必须是Observer抽象类的派生类才行,并且这个观察者还不能带参数,而且接口参数不支持变化,那么观察者将不能应付接口的变化。那么应该如何解决这个问题呢?可以使用C++11一些特性来改变。

class NonCopyable
{
protected:
    NonCopyable() = default;
    ~NonCopyable() = default;
    NonCopyable(const NonCopyable&) = delete; //禁用拷贝构造
    NonCopyable& operator = (const NonCopyable&) = delete; //禁用赋值构造
};

#include <iostream>
#include <string>
#include <functional>
#include <map>

using namespace std;

template<typename Func>
class Events : NonCopyable
{
public:
    Events(){}
    ~Events(){}
    //注册观察者,支持右值
    int Connect(Func&& f)
    {
        return Assgin(f);
    }
    //注册观察者
    int Connect(Func& f)
    {
        return Assgin(f);
    }
    //移除观察者
    void Disconnect(int key)
    {
        m_connections.erase(key);
    }
private:
    //保存观察者并分配观察者编号
    template<typename F>
    int Assgin(F&& f)
    {
        int k = m_observerId++;
        m_connections.emplace(k, std::forward<F> (f));
    }
    int m_observerId = 0;
    std::map<int, Func> m_connections;
};

C++11实现的观察者,内部为了一个泛型函数列表,观察者只需要将观察者函数进行注册进来即可,消除了继承导致的强耦合。通知接口使用了可变参数模板,支持任意参数,这就消除了接口变化的影响。文章来源地址https://www.toymoban.com/news/detail-627397.html

到了这里,关于C++设计模式行为型之观察者模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式—行为型模式之观察者模式

    观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependent

    2024年01月22日
    浏览(44)
  • 设计模式之观察者模式【行为型模式】

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博

    2024年02月03日
    浏览(47)
  • 行为型设计模式之观察者模式【设计模式系列】

    C++技能系列 Linux通信架构系列 C++高性能优化编程系列 深入理解软件架构设计系列 高级C++并发线程编程 设计模式系列 期待你的关注哦!!! 现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reali

    2024年02月15日
    浏览(44)
  • 【行为型设计模式】C#设计模式之观察者模式

    参考代码:

    2024年02月13日
    浏览(50)
  • 笨蛋学设计模式行为型模式-观察者模式【14】

    8.1.1概念 ​ 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象状态发生变化时,会通知所有依赖它的观察者对象,使它们都能够得到通知并且被自动更新 8.1.2场景 ​ 在我们生活中,用户可以在音乐播放平台关注多个歌手,而

    2024年01月24日
    浏览(70)
  • c#设计模式-行为型模式 之 观察者模式

    又被称为发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依赖关系,让多个观察者 对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自 动更新自己。 在观察者模式中有如下角色: Subject:抽象主题(抽象被观察者)

    2024年02月14日
    浏览(38)
  • C++ 设计模式之观察者模式

    【声明】本题目来源于卡码网(题目页面 (kamacoder.com)) 【提示:如果不想看文字介绍,可以直接跳转到C++编码部分】 【设计模式大纲】          前面的文章介绍了创建型模式和结构型模式,今天开始介绍行为型模式。 【简介】什么是观察者模式 (第13种模式)     

    2024年01月16日
    浏览(43)
  • 【设计模式】Head First 设计模式——观察者模式 C++实现

    设计模式最大的作用就是在变化和稳定中间寻找隔离点,然后分离它们,从而管理变化。将变化像小兔子一样关到笼子里,让它在笼子里随便跳,而不至于跳出来把你整个房间给污染掉。 主题对象(出版者)管理某些数据,当主题内的数据改变,就会通知观察者(订阅者)。

    2024年02月10日
    浏览(41)
  • 【C++ 观察者模式 思想理解】C++中的观察者模式:松耦合设计与动态交互的艺术,合理使用智能指针观察者

    在进入技术细节之前,理解观察者模式(Observer Pattern)的基本概念和它在现代编程中的重要性是至关重要的。 观察者模式是一种设计模式,它定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。在C++中,这个

    2024年01月24日
    浏览(56)
  • 设计模式(四) —— 观察者模式/发布订阅模式,c和c++示例代码

    往期地址: 设计模式(一)——简单工厂模式 设计模式(二)——策略模式 设计模式(三)——装饰模式 本期主题: 使用c和c++代码,讲解观察者模式、发布订阅模式 发布-订阅模式是一种行为设计模式,它允许多个对象通过事件的发布和订阅来进行通信; 在这种模式中,

    2023年04月17日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包