C++设计模式 - 模板模式

一:概述

模板方法(Template Method)是一种行为型设计模式。它定义了一个算法的基本框架,并且可能是《设计模式:可复用面向对象软件的基础》一书中最常用的设计模式之一。

模板方法的核心思想很容易理解。我们需要定义一个包含多个固定步骤的算法框架。具体的实现类只能重写这些步骤,但不能改变整体框架。这些步骤通常被称为钩子方法(hook methods)。

二:设计思想

  • 定义一个包含多个典型步骤的算法框架。
  • 子类可以调整这些步骤,但不能改变整体框架。

三:使用场景

  • 需要使用算法的不同版本。
  • 这些算法版本由相似的步骤组成。

四:模式结构

AbstractClass(抽象类)

  • 定义算法的结构,由多个步骤组成。
  • 算法的步骤可以是虚函数或纯虚函数。

ConcreteClass(具体类)

  • 根据需要重写算法的特定步骤。

五:代码示例

cpp 复制代码
#include <iostream>

// 抽象基类,定义模板方法
class Meal {
public:
    // 模板方法,final 关键字确保子类不能重写该方法
    void prepareMeal() {  
        boilWater();              // 步骤 1:烧水
        cook();                   // 步骤 2:烹饪,子类需要实现
        serve();                  // 步骤 3:上菜
    }

    virtual ~Meal() = default;

private:
    void boilWater() {                // 步骤 1:烧水,所有餐食共享的步骤
        std::cout << "Boiling water\n";
    }

    virtual void cook() = 0;          // 步骤 2:烹饪,子类必须实现
    virtual void serve() = 0;         // 步骤 3:上菜,子类必须实现
};

// 具体子类:制作汤
class Soup : public Meal {
private:
    void cook() override {            // 实现具体的烹饪步骤
        std::cout << "Cooking soup\n";
    }

    void serve() override {           // 实现具体的上菜步骤
        std::cout << "Serving soup\n";
    }
};

// 具体子类:制作沙拉
class Salad : public Meal {
private:
    void cook() override {            // 实现具体的烹饪步骤
        std::cout << "Preparing salad\n";
    }

    void serve() override {           // 实现具体的上菜步骤
        std::cout << "Serving salad\n";
    }
};

int main() {
    std::cout << "Preparing meal of Soup:\n";
    Meal* meal = new Soup();
    meal->prepareMeal();              // 调用模板方法,自动完成一系列步骤
    delete meal;

    std::cout << "\nPreparing meal of Salad:\n";
    meal = new Salad();
    meal->prepareMeal();              // 调用模板方法,自动完成一系列步骤
    delete meal;

    return 0;
}

六:相关模式

模板方法模式和策略模式的使用场景非常相似。两者都允许提供算法的不同变体。模板方法模式通过子类化在类级别上实现,而策略模式通过对象组合在对象级别上实现。策略模式将不同的策略作为对象提供,因此可以在运行时交换策略。模板方法模式倒置了控制流,遵循好莱坞原则:"别找我们,我们来找你"。策略模式通常是一个黑盒,它允许你在不需要了解其细节的情况下替换策略。

七:优缺点

优点

  • 通过创建新的子类,新的算法变体易于实现。
  • 算法中的共同步骤可以直接在接口类中实现。

缺点

  • 即使是算法的小变体,也需要创建一个新的类,这可能导致创建许多小类。
  • 算法框架是固定的,无法更改;不过,你可以通过将框架函数设为虚函数来克服这一限制。

参考:

  1. https://zh.wikipedia.org/wiki/%E6%A8%A1%E6%9D%BF%E6%96%B9%E6%B3%95

  2. The Template Method -- MC++ BLOG

相关推荐
玖玥拾3 小时前
C/C++ 基础笔记(十四)多态与模板编程
c语言·c++·多态·模板
Roann_seo%3 小时前
C++文件操作完全指南:从文本读写到二进制文件处理
开发语言·c++
坚果派·白晓明4 小时前
【鸿蒙PC】SDL3 适配:AtomCode + Skills 快速集成 NAPI 测试工具
c++·华为·ai编程·harmonyos·atomcode
凡人叶枫5 小时前
Effective C++ 条款17:以独立语句将 newed 对象置入智能指针
java·linux·开发语言·c++·算法
我爱cope6 小时前
【Agent智能体26 | 多智能体-多智能体工作流】
人工智能·设计模式·语言模型·职场和发展
凡人叶枫6 小时前
Effective C++ 条款16:成对使用 new 和 delete 时要采取相同形式
开发语言·c++·effective c++
不吃土豆的马铃薯6 小时前
C++ 高性能网络缓冲区 Buffer 源码解析
linux·服务器·开发语言·网络·c++
.千余7 小时前
【C++】C++继承入门(下):友元、静态成员与菱形继承的底层逻辑
开发语言·c++·笔记·学习·其他
初中就开始混世的大魔王7 小时前
6 Fast DDS-传输层
开发语言·c++·中间件·信息与通信
代码中介商9 小时前
C++ 智能指针完全指南(三):weak_ptr 与循环引用
开发语言·c++