模板方法模式(Template Method Pattern) C++

news/2024/10/23 9:27:32/

上一节:工厂模式(Factory Pattern) C++

文章目录

  • 1.理论
  • 2.实践

1.理论

模板方法模式(Template Method Pattern)是一种行为设计模式,用于定义一个算法的骨架,将一些步骤的实现延迟到子类中。在模板方法模式中,一个抽象类定义了一个模板方法,该方法包含了算法的主要步骤,而具体的实现则由子类来完成。
模板方法模式的核心思想是,将算法的结构固定下来,但是允许子类根据自己的需要实现特定的步骤。这样可以保持算法的一致性,同时又能够灵活地扩展和定制算法的具体实现。
以下是模板方法模式的主要参与者:

  1. 抽象类(Abstract Class) :定义一个模板方法,该方法包含了算法的主要步骤,其中某些步骤可以由子类来实现。抽象类可以包含具体方法、抽象方法或钩子方法(可以由子类选择性地实现)。
  2. 具体类(Concrete Class):继承抽象类并实现其中的抽象方法,完成算法的具体步骤。

模板方法模式的工作流程如下:

  1. 抽象类定义了一个模板方法,该方法包含了算法的主要步骤,并调用其他方法完成算法的各个子步骤。
  2. 具体类继承抽象类,并实现其中的抽象方法,完成算法的具体实现。
  3. 客户端代码通过调用抽象类的模板方法来执行算法,具体的步骤由具体类来完成。

通过使用模板方法模式,可以实现算法的复用和扩展。算法的骨架由抽象类定义,而具体的实现可以在具体类中灵活地实现和修改,从而提高代码的复用性和可维护性。

2.实践

你现在是一个游戏开发人员,你要设计一个游戏,其中有两个角色:战士(Warrior)和法师(Wizard)。每个角色都有一个公共的行为:攻击(Attack)。战士和法师的攻击方式略有不同,但它们都有相同的执行流程。这就是我们可以使用模板方法模式的场景。
首先,我们创建一个抽象类Character,它定义了一个模板方法Attack(),以及两个具体方法PrepareWeapon()和ExecuteAttack()。

#include <iostream>class Character {
public:void Attack() {PrepareWeapon();ExecuteAttack();std::cout << "Attack finished." << std::endl;}virtual void PrepareWeapon() = 0;virtual void ExecuteAttack() = 0;
};

接下来,我们创建具体类Warrior和Wizard,它们分别继承自Character,并实现了具体的攻击方式。

class Warrior : public Character {
public:void PrepareWeapon() override {std::cout << "Warrior prepares sword and shield." << std::endl;}void ExecuteAttack() override {std::cout << "Warrior swings the sword and strikes the enemy." << std::endl;}
};class Wizard : public Character {
public:void PrepareWeapon() override {std::cout << "Wizard prepares magic staff." << std::endl;}void ExecuteAttack() override {std::cout << "Wizard casts a powerful spell on the enemy." << std::endl;}
};

现在,我们可以使用这些类来创建角色对象并执行攻击。

int main() {Character* warrior = new Warrior();warrior->Attack();Character* wizard = new Wizard();wizard->Attack();delete warrior;delete wizard;return 0;
}

执行结果

Warrior prepares sword and shield.
Warrior swings the sword and strikes the enemy.
Attack finished.
Wizard prepares magic staff.
Wizard casts a powerful spell on the enemy.
Attack finished.

完整代码:

#include <iostream>class Character {
public:void Attack() {PrepareWeapon();ExecuteAttack();std::cout << "Attack finished." << std::endl;}virtual void PrepareWeapon() = 0;virtual void ExecuteAttack() = 0;
};
class Warrior : public Character {
public:void PrepareWeapon() override {std::cout << "Warrior prepares sword and shield." << std::endl;}void ExecuteAttack() override {std::cout << "Warrior swings the sword and strikes the enemy." << std::endl;}
};class Wizard : public Character {
public:void PrepareWeapon() override {std::cout << "Wizard prepares magic staff." << std::endl;}void ExecuteAttack() override {std::cout << "Wizard casts a powerful spell on the enemy." << std::endl;}
};
int main() {Character* warrior = new Warrior();warrior->Attack();Character* wizard = new Wizard();wizard->Attack();delete warrior;delete wizard;return 0;
}

在这个例子中,抽象类Character定义了一个模板方法Attack(),它规定了攻击的执行流程。具体类WarriorWizard继承自Character,并根据自己的特点实现了具体的攻击方式。客户端代码通过调用Attack()方法来触发攻击,而具体的攻击流程由各个角色类来完成。

这就是模板方法模式的基本思想:将算法的骨架定义在抽象类中,而将具体的实现留给子类来完成。这样可以实现算法的复用和扩展,同时保持算法的一致性。

下一节:还没有写


http://www.ppmy.cn/news/111348.html

相关文章

如何系统地学习IT技术

从基础技术到高级应用&#xff0c;IT技术发展迅速&#xff0c;我们需要建立系统性的学习方法&#xff0c;才能跟上它的速度。接下来&#xff0c;我将分享我的个人经验&#xff0c;介绍如何系统地学习IT技术&#xff0c;以及如何在快速学习过程中确保自己的技术水平越来越高。 …

使用 Web-Socket 客户端在两个 ESP32 之间进行实时数据传输

介绍 近年来, 基于Arduino和ESP32 的网络服务器项目变得非常流行,并且对各种应用都很有用。但是这种 Web 服务器的主要缺点之一是它的静态特性。意味着通过 HTTP 更新网页,您需要更新整个网页,然后才能更新任何数据。这个问题有很多解决方法,比如几秒钟后自动刷新网页等等…

零基础搭建私人影音媒体平台【远程访问Jellyfin播放器】

目录 1. 前言 2. Jellyfin服务网站搭建 2.1. Jellyfin下载和安装 2.2. Jellyfin网页测试 3.本地网页发布 3.1 cpolar的安装和注册 3.2 Cpolar云端设置 3.3 Cpolar本地设置 4.公网访问测试 5. 结语 转载自cpolar极点云的文章&#xff1a;零基础搭建私人影音媒体平台【…

计算机端口怎么配置波特率,怎么查看车载导航端口号、波特率和取码方式?

怎么查看车载导航端口号、波特率和取码方式?同事CFMR心灵手巧&#xff0c;整天为同事们解决电脑问题&#xff0c;在同事中有极佳的口碑。这几天折腾车载导航&#xff0c;颇有心得&#xff0c;笔者留心在一边偷学&#xff0c;现在把自己学到的一知半解&#xff0c;半瓶子醋的心…

linux 0891端口,凯立德导航专用版本号及分辨率、端口、波特率

C0015,帮手CA4001,320240,ARM,COM6 4800 C0017,帮手CA3126,480x234,ARM,COM6 4800 C0028,路畅D2280HA,800x480,MIPS,COM1 9600 C0030,路畅A2270,480x234,MIPS,COM1 9600 C0031,路畅A2265,400x234,MIPS,COM1 9600 C0039,路畅A2265R,400x234,ARM,COM1 9600 C0268,路特仕--凯越…

LTK5135M MSOP-8封装 耐压7V_F类、单声道音频放大器/兼容于4890,音质更好适用于车载导航仪、对讲机、便携游戏机等

概述 LTK5135M 是一款 5V-4Ω-3.3W、差分输 入单声道 F 类音频功率放大器。LTK5135M 采用 高耐压工艺&#xff0c;耐压可达 7V, LTK5135M 具有芯片低功耗功能只需使用一个 IO 口&#xff0c;可控制功放开 启、关闭随意切换。AB 类模式下能解决传统 D 类功放对 FM 的干扰问题&…

电子购物网站导航制作

淘宝、天猫、苏宁易购、亚马逊每个购物网站都有一个左侧竖栏导航条&#xff0c;正处于学习阶段&#xff0c;本文只提供一种实现方法。 电子购物网站导航源码&#xff1a; <!doctype html> <html lang"en"> <head><meta charset"UTF-8&qu…

js实现-商城分类导航效果

<script> window.οnlοadfunction(){var Lisdocument.getElementsByTagName("li");for(i0;i<Lis.length;i){ Lis[i].i i;Lis[i].οnmοuseοverfunction(){this.className"lihover";var h0 (this.i - 1) * 30 42;var y this.getElementsByTa…