首页 > 编程语言 >C++设计模式04 —— 观察者模式

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

时间:2024-01-10 15:34:50浏览次数:31  
标签:... 04 filePath void 进度条 观察者 C++ 设计模式 public

观察者模式

  • 一种一对多的依赖关系,当被依赖的对象发生改变时,所有依赖它的对象都能够做出相应的改变。

  • 为一个文件分割器加入进度展示。我们需要支持多个类型的进度条,我们可以随意操控进度条的样式细节。


首先,我们做一个进度条的抽象基类

class IProgress{
public:
    virtual void DoProgress(float value)=0;
    virtual ~IProgess(){};
};

在文件分割器中,我们有一个进度条的列表,并支持添加和删除进度条。

class FileSpliter{
public:
    FileSpliter(const string& filePath, int fileNumber, IProgress* progressbar):m_filePath(filePath),m_fileNumber(fileNumber){}
    void splite(){
        // 读取文件

        // 分批次向文件中写入
        for(int i=0;i<m_fileNumber;i++){
            // ...
            onProgress(float(i+1)/m_fileNumber);
        }
    }

    void addProgressBar(IProgress* progressBar){
        progressBarList.push_back(progressBar);
    }

    void removeProgressBar(IProgress* progressBar){
        progressBarList.remove(progressBar);
    }

    void onProgress(float value){
        for(auto progressBar:progressBarList){
            progressBar->DoProgress(value);
        }
    }

private:
    string m_filePath;
    int m_fileNumber;
    vector<IProgress*> progressBarList;
};

最后,在主程序中,我们可以自由添加进度条,并定义进度条的实现细节

class   OtherProgressBar:public IProgress{
public:
    virtual void DoProgress(float value){
        // ...
    }
};

class MainWindow:public Window, public IProgress{
private:
    // ...
public:
    virtual void DoProgress(float value){
        // ...
    }
    
    void main(){
        // ...

        FileSpliter spliter(filePath, number);

        OtherProgressBar pb;

        spliter.addProgressBar(this);
        spliter.addProgressBar(&pb);
    }
    
};

观察者模式,让进度条和主程序之间解耦,我可以随意的添加减少进度条,并随意的修改进度条的实现细节。

观察者无需指定进度条,进度条自己决定自己是否加入到进度条队列中。

标签:...,04,filePath,void,进度条,观察者,C++,设计模式,public
From: https://www.cnblogs.com/torch-hxm/p/17956572

相关文章

  • Helix QAC 2023.4 新版支持C++20语言,带来更多性能提升!
    HelixQAC2023.4新增功能HelixQAC2023.4全面支持MISRAC++:2023®规则,涵盖100%的指南。此版本还加强了对C++20语言的支持,改进了数据流分析性能,并在整个产品中增加了多项用户体验改进。增强的C++20支持此版本新增了对以下语言特性的支持:-模板参数列表和函数声明的requires-clau......
  • Helix QAC 2023.4 新版支持C++20语言,带来更多性能提升!
    HelixQAC2023.4新增功能HelixQAC2023.4全面支持MISRAC++:2023®规则,涵盖100%的指南。此版本还加强了对C++20语言的支持,改进了数据流分析性能,并在整个产品中增加了多项用户体验改进。增强的C++20支持此版本新增了对以下语言特性的支持:-模板参数列表和函数声明的require......
  • C++和Qt面试题(精简版)
    C++面试题什么是c++?请简述它的优点和缺点c++是一种面向对象的编程语言,实现了继承、抽象、多态和封装等概念。**优点:**能够开发复杂的应用程序,提供了极大地灵活性,让开发者能够控制资源的使用和可用性,从而最大限度的提高性能。**缺点:**由于C++太过自由,导致指针对内存操作时可能造成内......
  • 04_进程管理
    0.写在前面进程与线程的关系Linux如何存放和表示进程(tast_struct、thread_info)如何创建进程(fork()、最终调用clone())如何把新的执行映像装入到地址空间(exec()族)如何表示进程的层次关系,父进程如何收集后代信息(wait()系统调用族)进程是如何消亡的(exit())一、进程描述符每个......
  • C++字符串操作函数笔记#
    1.strcpy()从strSrc地址开始且含有'\0'结束符的字符串复制到strDest开始的地址空间中,返回值类型为char* char*strcpy(char*strDest,constchar*strSrc) { assert((strDest!=NUL)&&(strSrc!=NULL)); char*address=strDest; while((*strDest++=*strSr......
  • c++内存打印函数
    voidPrintBuffer(void*pBuff,unsignedintnLen){if(NULL==pBuff||0==nLen){return;}constintnBytePerLine=16;unsignedchar*p=(unsignedchar*)pBuff;charszHex[3*nBytePerLine+1]={0};printf("--......
  • 使用 Ubuntu 20.04 进行初始服务器设置
    前些天发现了一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站。使用Ubuntu20.04进行初始服务器设置介绍首次创建新的Ubuntu20.04服务器时,应该执行一些重要的配置步骤作为初始设置的一部分。这些步骤将提高服务器的安全性和可......
  • 刷题笔记——栈(C++)
    LCR148.验证图书取出顺序-力扣(LeetCode)现在图书馆有一堆图书需要放入书架,并且图书馆的书架是一种特殊的数据结构,只能按照 一定 的顺序 放入 和 拿取 书籍。给定一个表示图书放入顺序的整数序列 putIn,请判断序列 takeOut 是否为按照正确的顺序拿取书籍的操作序列。你可......
  • 【设计模式】建造者模式——建造者模式在Android SDK源码中的应用
    建造者模式在AndroidSDK源码中也有广泛的应用,本文挑两个典型的类讨论一下:AlertDialog.Builder在Android源码中最常用到的建造者模式非AlertDialog.Builder莫属,代码如下:AlertDialogalertDialog=newAlertDialog.Builder(mContext) .setTitle("系统提示:").setMessage("请......
  • 2023 年精选:每个 DevOps 团队都应该了解的 5 种微服务设计模式
    微服务彻底改变了应用程序开发世界,将大型整体系统分解为更小、更易于管理的组件。这种架构风格的特点是独立、松散耦合的服务,带来了从可扩展性、模块化到更高的灵活性等众多优势。DevOps团队如何最好地利用这种方法来实现最高效率?答案在于理解并有效地采用微服务设计模式。在本文......