首页 > 编程语言 >《模版模式(极简c++)》

《模版模式(极简c++)》

时间:2024-04-09 12:58:05浏览次数:25  
标签:极简 步骤 子类 void c++ 算法 模版 父类

        本文章属于专栏- 概述 - 《设计模式(极简c++版)》-CSDN博客


       本章简要说明适配器模式。本文分为模式说明、本质思想、实践建议、代码示例四个部分。

模式说明

  • 方案: 模版模式定义了一个逻辑的骨架,将某些步骤推迟到子类中实现。父类定义了一个模版方法,该方法包含了算法的基本结构,而其中的某些步骤由子类实现。
  • 优点:
    • 提供了代码复用:将公共的算法逻辑放在父类中,避免了代码重复。
    • 提高了扩展性:子类可以通过实现特定的方法来改变算法的某些步骤,而不需要修改父类的代码。
  • 缺点:
    • 增加了类的数量:引入了多个子类来实现算法的不同部分,可能会增加类的数量和复杂性。
    • 子类必须遵循父类的模版:子类必须实现父类定义的抽象方法,这可能限制了子类的灵活性。

本质思想:在模版模式中,将逻辑的结构定义在一个父类中,而将具体的步骤实现延迟到子类中。这样可以在不改变算法整体结构的情况下,让子类自由地实现某些步骤,从而实现算法的定制化。

实践建议:十分推荐。在一个部门多个服务,且有相同部分可以抽象时,使用一个基类来约束大家的业务行为,不仅降低新人培养成本,也让不同人切换维护的服务成本更低。增加了团队效率。

代码示例:

#include <iostream>

// 父类定义算法的骨架
class Bird {
public:
    void fly() {
        // 模版方法,定义了算法的骨架
        gatherMaterials();
        buildNest();
        layEggs();
        sitOnEggs();
    }

    // 抽象方法,需要由子类实现
    virtual void buildNest() = 0;
    virtual void layEggs() = 0;
    virtual void sitOnEggs() = 0;

    // 共同步骤可以在父类中实现
    void gatherMaterials() {
        std::cout << "Gathering materials for nest." << std::endl;
    }
};

// 子类实现具体的步骤
class Sparrow : public Bird {
public:
    void buildNest() override {
        std::cout << "Building a small nest." << std::endl;
    }

    void layEggs() override {
        std::cout << "Laying small eggs." << std::endl;
    }

    void sitOnEggs() override {
        std::cout << "Sparrow is sitting on eggs." << std::endl;
    }
};

// 另一个子类实现具体的步骤
class Eagle : public Bird {
public:
    void buildNest() override {
        std::cout << "Building a large nest." << std::endl;
    }

    void layEggs() override {
        std::cout << "Laying large eggs." << std::endl;
    }

    void sitOnEggs() override {
        std::cout << "Eagle is sitting on eggs." << std::endl;
    }
};

int main() {
    Sparrow sparrow;
    std::cout << "Sparrow lifecycle:" << std::endl;
    sparrow.fly();
    std::cout << std::endl;

    Eagle eagle;
    std::cout << "Eagle lifecycle:" << std::endl;
    eagle.fly();
    return 0;
}

/*
Output:
Sparrow lifecycle:
Gathering materials for nest.
Building a small nest.
Laying small eggs.
Sparrow is sitting on eggs.

Eagle lifecycle:
Gathering materials for nest.
Building a large nest.
Laying large eggs.
Eagle is sitting on eggs.
*/

标签:极简,步骤,子类,void,c++,算法,模版,父类
From: https://blog.csdn.net/ly52352148/article/details/137547222

相关文章

  • UE中UPROPERTY的用法(UEC++个人学习笔记)
    UPROPERTY设置可视//仅在类默认设置可见(即里面面板) UPROPERTY(VisibleDefaultsOnly) int32VisibleDefaultsOnlyInt; //仅在实例化细节面板可见(即外面面板) UPROPERTY(VisibleInstanceOnly) FStringVisibleInstancestring; //类默认设置和实例化细节面板都可见......
  • C++使用getline实现split的效果
    0.问题C++中并没有类似split的分隔符函数,如何自建一个呢?我们考虑使用getline来实现所需功能。1.代码#include<iostream>#include<string>#include<vector>#include<sstream>//使用字符串流将字符串分割成多个子串,并存储到vector中std::vector<std::string>split......
  • C++ Note 继承指向
    引自:https://blog.csdn.net/baidu_35679960/article/details/80812527引自:https://blog.csdn.net/qq_21989927/article/details/111226696引自:https://www.runoob.com/cplusplus/cpp-polymorphism.html 为什么父类指针可以指向子类实例:可以通俗的理解,子类可能含有一些父类没......
  • 为什么C++中不能将数组的内容拷贝给其他数组作为初始值,也不能用数组给其他数组赋值
    0前言来自primer的3.5部分以下写法是有问题的inta[]={0,1,2}inta2[]=a;//错误,不允许使用一个数组初始化另一个数组a2=a;//错误:不能把一个数组赋值给另一个数组有些编译器支持上面的操作,但是书上说这属于非标准功能,是编译器扩展1原因C++中的数组......
  • C++与Qt中回调函数的两种实现方法
    一.回调函数介绍1.概念回调函数是一种在程序运行期间通过函数指针调用的函数,它通常用于实现事件驱动、异步通信、消息传递等功能。在回调函数中,被调用的函数通常称为回调函数(CallbackFunction),而调用回调函数的函数通常称为回调函数容器(CallbackContainer)。回调函数容器可......
  • 20240408,C++数组,函数,指针
    是谁说回老家学习结果摆烂了两天,是我,Π—Π! Π—Π!! 一,数组——同C1.1一维数组1.0  相同类型,连续内存,1.1  定义格式:数据类型数组名【长度】;数组类型数组名【长度】={1,2,3,……};数组类型数组名【】={1,2,3,……};1.2  遍历数组,初始化,下标【0-N】1.3  数组名:数......
  • 【C++对C语言的拓展】引用--3
    1.8指针引用#include <iostream>usingnamespace std; struct Teacher { char name[64]; int age ; }; //在被调⽤用函数获取资源int getTeacher(Teacher **p) {     Teacher *tmp = NULL; if (p == NULL)......
  • C++奇迹之旅:我与类和对象相遇
    文章目录......
  • C++ 入门一
    C++入门一1.C++关键字2.命名空间2.1命名空间定义2.2命名空间使用3.C++输入&输出C++是一种高级编程语言,由BjarneStroustrup在20世纪80年代初期在贝尔实验室开发。它是对C语言的扩展,添加了面向对象编程的特性,如类和对象、继承、多态和封装。C++支持多种编程范式,......
  • 【简单讲解下C++max函数的使用】
    ......