首页 > 编程语言 >设计模式 C++

设计模式 C++

时间:2023-09-15 15:23:07浏览次数:45  
标签:... 子类 void C++ public virtual 设计模式 class

(设计模式) (李建忠 C++) 23种设计模式

组件协作

模板方法

父类中定义组件(函数)的调用流程,每个组件使用虚函数进行实现,然后子类中可以重写父类中虚函数的实现。
如果我们发现一个算法的组件(函数)的调用流程都是一样的,但是步骤中的各个组件的实现可能有所差异,此时会使用模板方法。
【注】稳定的是骨架,变化的是组件的具体实现。

版本1

//程序库开发人员
class Library {
public:
    void Step1() {
        //...
    }

    void Step3() {
        //...
    }

    void Step5() {
        //...
    }
};


//应用程序开发人员
class Application {
public:
    bool Step2() {
        //...
    }

    void Step4() {
        //...
    }
};

// 用户使用算法
int main() {
    Library lib();
    Application app();

    lib.Step1();

    if (app.Step2()) {
        lib.Step3();
    }

    for (int i = 0; i < 4; i++) {
        app.Step4();
    }

    lib.Step5();
}

要调用这个算法,用户需要调用step1~step5,这个过程可以由框架本身实现,而不是用户去实现,改进代码如下:

//程序库开发人员
class Library {
public:
    //稳定 template method
    void Run() {
        Step1();

        if (Step2()) {  //支持变化 ==> 虚函数的多态调用
            Step3();
        }

        for (int i = 0; i < 4; i++) {
            Step4();  //支持变化 ==> 虚函数的多态调用
        }

        Step5();
    }
    virtual ~Library() {
    }

protected:
    void Step1() {  //稳定
        //.....
    }
    void Step3() {  //稳定
        //.....
    }
    void Step5() {  //稳定
        //.....
    }

    virtual bool Step2() = 0;  //变化
    virtual void Step4() = 0;  //变化
};

//应用程序开发人员
class Application : public Library {
protected:
    virtual bool Step2() {
        //... 子类重写实现
    }

    virtual void Step4() {
        //... 子类重写实现
    }
};

int main() {
    Library* pLib = new Application();
    lib->Run();

    delete pLib;
}

上面将具体的实现子类实现,在muduo库中也有类似的方法,不过muduo库中使用的回调函数(函数指针)实现的。
子类可以重写的虚函数,一般设置为protected,因为这些方法一般不需要对用户可见。

策略模式

使用了抽象类,子类中使用定义具体的抽象类实现。当类A使用中使用抽象类指针时,A类中一般会定义一个函数给抽象类指针传递具体的对象,那么类A就可以中就可以根据指针指向的对象实现多态。
【注】类A是稳定的,变化的是子类。

模板方法中父类定义了处理流程,子类定义了组件的具体实现。
策略模式:我觉得主要讲的是将算法抽象成一个抽象类,不同的算法都实现这个抽象类。

当if else或switch的可能性在未来可能会继续扩展时,就要想到用策略模式。策略模式中抽象类指针接收不同的子类对象来实现if else或switch。

版本1:

enum TaxBase {
    CN_Tax,
    US_Tax,
    DE_Tax,
    FR_Tax  //更改
};

class SalesOrder {
    TaxBase tax;

public:
    double CalculateTax() {
        //...

        if (tax == CN_Tax) {
            // CN***********
        } else if (tax == US_Tax) {
            // US***********
        } else if (tax == DE_Tax) {
            // DE***********
        } else if (tax == FR_Tax) {  //更改
                                     //...
        }

        //....
    }
};
class TaxStrategy {
public:
    virtual double Calculate(const Context& context) = 0;
    virtual ~TaxStrategy() {
    }
};

class CNTax : public TaxStrategy {
public:
    virtual double Calculate(const Context& context) {
        //***********
    }
};

class USTax : public TaxStrategy {
public:
    virtual double Calculate(const Context& context) {
        //***********
    }
};

class DETax : public TaxStrategy {
public:
    virtual double Calculate(const Context& context) {
        //***********
    }
};

//扩展
//*********************************
class FRTax : public TaxStrategy {
public:
    virtual double Calculate(const Context& context) {
        //.........
    }
};

class SalesOrder {
private:
    TaxStrategy* strategy;

public:
    SalesOrder(StrategyFactory* strategyFactory) {
        this->strategy = strategyFactory->NewStrategy();
    }
    ~SalesOrder() {
        delete this->strategy;
    }

public
    double CalculateTax() {
        //...
        Context context();

        double val = strategy->Calculate(context);  //多态调用
        //...
    }
};

对象创建

工厂方法

抽象工厂

对象性能

单件模式 Singleton

单件模式:保证在系统中只存在一个实例。

标签:...,子类,void,C++,public,virtual,设计模式,class
From: https://www.cnblogs.com/codingbigdog/p/17705075.html

相关文章

  • 软件设计模式系列之六——单例模式
    1模式的定义单例模式(SingletonPattern)是一种常见的创建型设计模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点来获取该实例。这意味着无论何时何地,只要需要该类的实例,都会返回同一个实例,而不是创建多个相同的实例。单例模式通常用于管理全局状态、资源共享或限制......
  • C++中STL用法汇总
    1什么是STL?STL(StandardTemplateLibrary),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++StandardLibrary)中,是ANSI/ISOC++标准中最新的也是极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程......
  • 趣解设计模式之《小店儿菜单的故事》
    〇、小故事在一座小镇上,有两家特别有名气的小店,一家是远近闻名的早餐店,它家的早餐特别好吃,每天早上都能排起长长的队伍;另一家是个蛋糕店,他家是专门从法国请来的蛋糕师傅,蛋糕的香味真是香飘万里。自从听说这个酱香拿铁销量非常高之后,这两家店的老板们就觉得强强联合才是能让小店更......
  • Qt/C++音视频开发53-本地摄像头推流/桌面推流/文件推流/监控推流等
    一、前言编写这个推流程序,最开始设计的时候是用视频文件推流,后面陆续增加了监控摄像头推流(其实就是rtsp视频流)、网络电台和视频推流(一般是rtmp或者http开头m3u8结尾的视频流)、本地摄像头推流(本地USB摄像头或者笔记本自带摄像头等)、桌面推流(将当前运行环境的系统桌面抓拍推流)。按......
  • C++完美转发为什么必须要有std::forward?
    先看一种情况,它的输出结果是什么?#include<iostream>usingnamespacestd;voidF(constint&a){cout<<"int:"<<a<<endl;}voidF(int&&a){cout<<"int&&:"<<a<<endl......
  • C++-类和对象(3)
    今天,继续和大家分享与类和对象相关的知识,本次文章的内容主要分享拷贝构造函数相关的知识。在学习拷贝构造函数之前,我们先对构造函数和析构函数进行一个总结回顾,在接这往下。构造函数和析构函数的总结回顾不论是构造函数还析构函数,我们只需要抓它们的特性,就可以很好的使用它们了。构......
  • 常用设计模式
    一、工厂模式+单例模式使用工厂模式来创建对象,通过单例模式来保证该工厂只有一个实例,从而减少创建对象时的开销。首先,创建一个工厂类,该类使用单例模式来保证只有一个实例,该实例负责创建对象。然后,根据需要创建多个工厂方法,每个方法用于创建不同的对象。classSingletonFacto......
  • C++下标运算符详解
    C++规定,下标运算符[]必须以成员函数的形式进行重载。该重载函数在类中的声明格式如下:返回值类型&operator[](参数);const返回值类型&operator[](参数)const;使用第一种声明方式,[]不仅可以访问元素,还可以修改元素。使用第二种声明方式,[]只能访问而不能修改元素。在实......
  • C++ STL
    Dev-C++可在工具->编译选项->代码生成/优化->代码生成->语言标准中选择“ISOC++11”或“GNUC++11”来支持C++11的新特性(蓝Dev还不支持C++14)不声明下,区间均为左闭右开区间,typename表示一个数据类型而不是C++的关键字。Containter(容器)vectorvector<t......
  • C++字符串
      1,2这个形式的字符串数组,就和普通数组一样,定义后面的大括号,里面装着每个具体的值,然后3,4直接表示出来,然后其实直接3就OK了,4可能是为了方便看。   字符串数组输入部分1.这个。。先把字符串数组定义好,然后使用cin直接输入进去2.如果想要读入包含空格键之类字符串的话......