设计模式之模板模式(C++)

简介: 设计模式之模板模式(C++)

一、模板模式是什么?

      模板模式是一种行为型的软件设计模式,在父类中定义了一个模板算法,只实现模板中的公共部分,将可变部分放在子类中实现,不同的子类对同一模板有不同的扩展和实现。


      模板模式的优点:


  1. 良好复用性。父类中公共部分可以多次使用,具备好的环境适应性。
  2. 良好扩展性。子类对父类模板的具体实现作扩展。
  3. 符合开闭原则。基于模板扩展功能,不需要改动原有代码。

     模板模式的缺点:


  1. 类个数增加。基于模板的每个实现,都要定义一个子类,容易使代码量膨胀。
  2. 若父类模板有改动,则子类均要同步更改。

二、模板模式

2.1 结构图

      客户端即Main主函数,定义好模板框架,具体步骤的实现交给子类完成。

2.2 代码示例

      场景描述:我是一个电脑店的老板,给我的徒弟们培训了一个大致的电脑安装教程,徒弟根据不同品牌不同客户的需求,参照我的教程完成安装。

//Template.h
/****************************************************/
#pragma once
#include <iostream>
#include <unordered_map>
#include <vector>
#include <list>
#include <string>
using namespace std;
// 定义模板类-电脑
class Computer 
{
public:
  // 装配
  void install() {
    cout << "电脑安装开始。" << endl;
    cout << "电脑品牌为:" << getComputerType() << endl;
    installProcessor();
    installMemory();
    installCaliche();
    cout << "电脑安装结束。" << endl;
  }
private:
  // 获取电脑类型
  virtual string getComputerType() = 0;
  // 安装处理器
  virtual void installProcessor() = 0;
  // 安装内存
  virtual void installMemory() = 0;
  // 安装硬盘
  virtual void installCaliche() = 0;
};
// 实现具体模板类-惠普电脑
class HPComputer : public Computer 
{
private:
  // 获取电脑类型
  virtual string getComputerType() {
    return "惠普";
  }
  // 安装处理器
  virtual void installProcessor() {
    cout << "安装处理器:Inter 酷睿i7-1260P" << endl;
  }
  // 安装内存
  virtual void installMemory() {
    cout << "安装内存:32GB DDR4-3200MHz" << endl;
  }
  // 安装硬盘
  virtual void installCaliche() {
    cout << "安装硬盘:1TB SSD" << endl;
  }
};
// 实现具体模板类-戴尔电脑
class DellComputer : public Computer 
{
private:
  // 获取电脑类型
  virtual string getComputerType() {
    return "戴尔";
  }
  // 安装处理器
  virtual void installProcessor() {
    cout << "安装处理器:Inter 酷睿i7-1265U" << endl;
  }
  // 安装内存
  virtual void installMemory() {
    cout << "安装内存:16GB DDR4-3200MHz" << endl;
  }
  // 安装硬盘
  virtual void installCaliche() {
    cout << "安装硬盘:512GB SSD" << endl;
  }
};
//main.cpp
/****************************************************/
#include <iostream>
#include <string>
#include "Template.h"
using namespace std;
int main() 
{
  Computer *computerA = new HPComputer();
  Computer *computerB = new DellComputer();
  computerA->install();
  cout << endl;
  computerB->install();
  delete computerA;
  delete computerB;
  computerA = nullptr;
  computerB = nullptr;
  return 0;
}

     程序结果如下。

      看过我“建造者模式”篇的小伙伴应该会发现,这两篇举的例子都是安装电脑。但是建造者模式中有一个“监工”负责落实建造的具体步骤和顺序,而模板模式中是父类承担了这个职责。

三、总结

      我尽可能用较通俗的话语和直观的代码例程,来表述我对模板模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解模板模式。

      如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

相关文章
|
1月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
2月前
|
存储 算法 C++
C++ STL 初探:打开标准模板库的大门
C++ STL 初探:打开标准模板库的大门
112 10
|
1月前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
21天前
|
安全 编译器 C++
【C++11】可变模板参数详解
本文详细介绍了C++11引入的可变模板参数,这是一种允许模板接受任意数量和类型参数的强大工具。文章从基本概念入手,讲解了可变模板参数的语法、参数包的展开方法,以及如何结合递归调用、折叠表达式等技术实现高效编程。通过具体示例,如打印任意数量参数、类型安全的`printf`替代方案等,展示了其在实际开发中的应用。最后,文章讨论了性能优化策略和常见问题,帮助读者更好地理解和使用这一高级C++特性。
37 4
|
21天前
|
算法 编译器 C++
【C++】模板详细讲解(含反向迭代器)
C++模板是泛型编程的核心,允许编写与类型无关的代码,提高代码复用性和灵活性。模板分为函数模板和类模板,支持隐式和显式实例化,以及特化(全特化和偏特化)。C++标准库广泛使用模板,如容器、迭代器、算法和函数对象等,以支持高效、灵活的编程。反向迭代器通过对正向迭代器的封装,实现了逆序遍历的功能。
32 3
|
27天前
|
设计模式 安全 Java
Kotlin - 改良设计模式 - 构建者模式
Kotlin - 改良设计模式 - 构建者模式
|
1月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
40 1
|
24天前
|
编译器 C++
【c++】模板详解(1)
本文介绍了C++中的模板概念,包括函数模板和类模板,强调了模板作为泛型编程基础的重要性。函数模板允许创建类型无关的函数,类模板则能根据不同的类型生成不同的类。文章通过具体示例详细解释了模板的定义、实例化及匹配原则,帮助读者理解模板机制,为学习STL打下基础。
29 0
|
2月前
|
编译器 程序员 C++
【C++打怪之路Lv7】-- 模板初阶
【C++打怪之路Lv7】-- 模板初阶
18 1
|
2月前
|
设计模式 Java Kotlin
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
本教程详细讲解Kotlin语法,适合希望深入了解Kotlin的开发者。对于快速学习Kotlin语法,推荐查看“简洁”系列教程。本文重点介绍了构建者模式在Kotlin中的应用与改良,包括如何使用具名可选参数简化复杂对象的创建过程,以及如何在初始化代码块中对参数进行约束和校验。
29 3