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

embedded/2024/11/30 17:57:31/

一、介绍

1.动机

在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现。

如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求?

 

2.定义

定义一个操作中的算法的骨架(稳定),而将一些步骤(变化)延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。——GOF

 

3.结构图

ab5ff648b08444d4bbf62fcede49f999.jpeg

 

4.要点总结

Template Method模式是一种非常基础性的设计模式,在面向对象系统中有着大量的应用。它用最简洁的机制(虚函数的多态性)为很多应用程序框架提供了灵活的扩展点,是代码复用方面的基本实现结构。

除了可以灵活应对步骤的变化外,“不要调用我,让我来调用你”的反向控制结构是Template Method的典型应用。

在具体实现方面,被Template Method调用的虚方法可以具有实现,也可以没有任何实现(抽象方法、纯虚方法),但一般推荐将它们设置为protected方法。

 

 

二、模板模式

1.概念

模板模式用于创建一个通用的算法结构,其中一些步骤可以在子类中自定义,从而实现代码重用和扩展。

①模板模式的优点:

  • 通过将不变部分的代码移至父类,子类只需要实现变化的部分,提高了代码复用。
  • 新增具体类时,不需要改变抽象类和其他具体类的代码,保证了代码的可维护性和扩展性。
  • 实现了反向控制(依赖倒置),即高层模块对低层模块的控制。

②模板模式的缺点:

  • 每一个不同的实现都需要一个子类来实现,可能会导致系统中类的数目增加。
  • 父类中的抽象方法由子类实现,子类的执行结果会影响到父类的结果,父类部分对子类产生了依赖性。

 

2.实现要点

  • 模板类:模板类定义了算法的骨架,其中包含的模板方法的顺序不可改变。模板方法通常包括一些通用的算法步骤,它们可以是抽象方法,也可以是一些具体的方法。
  • 具体类:具体类继承自模板类,并实现模板方法中的抽象步骤,以完成算法的具体逻辑。每个具体类可以实现不同的步骤,从而自定义算法的行为。

 

3.示例

//模板类
class TeaMaker {
public:void makeTea() {  //算法骨架prepareTeaLeaves();boilWater();steepTea();pourInCup();addCondiments();}
protected:virtual void prepareTeaLeaves() = 0;virtual void boilWater() = 0;virtual void addCondiments() = 0;void steepTea() {cout << "Steeping the tea." << endl;}void pourInCup() {cout << "Pouring tea into cup." << endl;}
};//具体类
class BlackTeaMaker :public TeaMaker {
protected:virtual void prepareTeaLeaves() override {cout << "Preparing black tea leaves." << endl;}virtual void boilWater() override {cout << "Boiling the black tea." << endl;}virtual void addCondiments() override {cout << "Adding sugar to black tea." << endl;}
};//具体类
class GreenTeaMaker :public TeaMaker {
protected:virtual void prepareTeaLeaves() override {cout << "Preparing green tea leaves." << endl;}virtual void boilWater() override {cout << "Boiling the green tea." << endl;}virtual void addCondiments() override {cout << "Adding lemon to green tea." << endl;}
};

测试代码:

TeaMaker* blackTea = new BlackTeaMaker();
blackTea->makeTea();
delete blackTea;
cout << endl;
TeaMaker* greenTea = new GreenTeaMaker();
greenTea->makeTea();
delete greenTea;

输出结果:

Preparing black tea leaves.
Boiling the black tea.
Steeping the tea.
Pouring tea into cup.
Adding sugar to black tea.Preparing green tea leaves.
Boiling the green tea.
Steeping the tea.
Pouring tea into cup.
Adding lemon to green tea.

 

 

 


http://www.ppmy.cn/embedded/141804.html

相关文章

爬虫技术全解析:从入门到精通

引言 在互联网时代&#xff0c;数据已成为最宝贵的资源之一。爬虫技术作为一种自动化获取网页数据的工具&#xff0c;被广泛应用于数据采集、信息聚合、市场分析等多个领域。本文将带你从零开始&#xff0c;全面了解爬虫技术&#xff0c;包括其基本原理、常用工具、编程实践以…

docker搭建nginx

一. 直接启动nginx镜像 1. 下载nginx镜像 docker pull nginx 2. 运行镜像 docker run -p 8080:80 --name web -d nginx 3. 网址查看 xx.xx.xx.xx:8080 二. 挂在文件启动nginx镜像 1. 拷贝docker文件到本地 docker cp web:/etc/nginx/nginx.conf /root/data/config/nginx…

Java图书管理系统(简易保姆级)

前面学习了这么多知识&#xff0c;为了巩固之前的知识&#xff0c;我们就要写一个图书管理系统来帮助大家复习&#xff0c;让大家的知识融会贯通~~~ 话不多说&#xff0c;直接开始今天的内容~ 首先呢&#xff0c;我们要有一个大体的思路&#xff1a; 实现效果思路有两种情况&a…

【VUE3】npm : 无法加载文件 D:\Program\nodejs\node_global\npm.ps1,因为在此系统上禁止运行脚本。

npm : 无法加载文件 D:\Program\nodejs\npm.ps1。未对文件 D:\Program\nodejs\npm.ps1 进行数字签名。无法在当前系统上运行该脚本。有关运行脚本和设置执行策略的详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_ Execution_Policies。…

vue3中的组件通信

前言&#xff1a; vue3有两种setup写法&#xff0c;本文将用最简洁的代码例子针对主流的<script setup>写法对每一种用法进行说明 props 父传子defineEmits 子传父mitt 兄弟组件$attrs &#xff08;子组件拿父组件&#xff09;refs &#xff08;一般父组件拿子组件数据&a…

如何测试一个社交应用的私信功能?

功能测试 1.发送和接收测试 在网络正常的情况下&#xff0c;能否发送文字、图片、附件、表情、特殊字符等&#xff0c;对方是否能够收到&#xff0c;并且正常展示 2.消息排序 3.消息撤回和删除 是否能够正常撤回&#xff0c;撤回后&#xff0c;展示什么 是否能够删除本地聊天记…

vue基础之3:模板语法、数据绑定

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

windows10桌面鼠标右键出现卡顿解决方法 - 副本

步骤如下&#xff1a; 1、按下“WinR” windows10鼠标点击右键出现卡顿的解决方法就为大家介绍到这里了。遇到类似问题的朋友&#xff0c;不要太过紧张&#xff0c;只要按照上面步骤操作一遍就好了。组合键打开运行&#xff0c;输入“regedit”点击确定打开注册表编辑器&…