长生栈 长生栈
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Living Team

编程技术分享
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 创建型模式

  • 结构型模式

  • 行为型模式

    • 责任链模式(Chain of Responsibility Pattern)
    • 命令模式(Command Pattern)
    • 解释器模式(Interpreter Pattern)
    • 迭代器模式(Iterator Pattern)
    • 中介者模式(Mediator Pattern)
    • 备忘录模式(Memento Pattern)
    • 观察者模式(Observer Pattern)
    • 状态模式(State Pattern)
    • 策略模式(Strategy Pattern)
    • 模板方法模式(Template Method Pattern)
      • 概念
      • 思想
      • 角色
      • 优点
      • 缺点
      • 类图
      • 示例代码
    • 访问者模式(Visitor Pattern)
  • 设计模式
  • 行为型模式
DC Wang
2023-05-28
目录

模板方法模式(Template Method Pattern)

# 模板方法模式(Template Method Pattern)

# 概念

模板方法模式是一种行为设计模式,它定义了一个操作的算法框架,将一些步骤的具体实现延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下重新定义算法中的某些步骤。

# 思想

模板方法模式基于"好莱坞原则",即"别调用我们,我们会调用你"。它通过定义一个抽象类,其中包含一个模板方法,该方法定义了算法的框架,然后通过具体的子类来实现模板方法中的具体步骤。

# 角色

  • AbstractClass(抽象类):定义模板方法和一些抽象方法,表示算法的框架。
  • ConcreteClass(具体类):实现抽象类中的抽象方法,提供算法的具体实现。

# 优点

  • 提供了一种代码复用的方式,避免了重复代码的编写。
  • 可以灵活地扩展和定制算法的特定步骤。
  • 符合开闭原则,即通过扩展子类,可以改变算法的行为,而无需修改抽象类的代码。

# 缺点

  • 模板方法模式在某种程度上限制了子类的灵活性,因为模板方法的结构已经定义好了,子类只能根据模板方法的结构进行实现。
  • 如果算法的框架发生改变,可能需要修改抽象类的代码和所有的子类。

# 类图

@startuml

class AbstractClass {
    +templateMethod(): void
    -abstractMethod1(): void
    -abstractMethod2(): void
}

class ConcreteClass {
    +abstractMethod1(): void
    +abstractMethod2(): void
}

AbstractClass <|-- ConcreteClass
note right of AbstractClass: 模板方法模式\nTemplate Method Pattern

@enduml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 示例代码

下面是一个使用C++实现的模板方法模式的示例代码:

#include <iostream>

class AbstractClass {
public:
    void templateMethod() {
        // 执行算法的框架
        step1();
        step2();
        step3();
    }

    virtual ~AbstractClass() {}

protected:
    virtual void step1() = 0;
    virtual void step2() = 0;
    virtual void step3() = 0;
};

class ConcreteClass : public AbstractClass {
protected:
    void step1() override {
        std::cout << "ConcreteClass: Step 1" << std::endl;
    }

    void step2() override {
        std::cout << "ConcreteClass: Step 2" << std::endl;
    }

    void step3() override {
        std::cout << "ConcreteClass: Step 3" << std::endl;
    }
};

int main() {
    AbstractClass* client = new ConcreteClass();
    client->templateMethod();

    delete client;
    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

代码运行结果:

ConcreteClass: Step 1
ConcreteClass: Step 2
ConcreteClass: Step 3
1
2
3

上述示例代码中,抽象类AbstractClass定义了一个模板方法templateMethod,该方法表示算法的框架,并调用了三个抽象方法step1、step2和step3。具体类ConcreteClass继承抽象类,并实现了这三个抽象方法。在main函数中,创建了一个ConcreteClass对象,并调用了templateMethod方法,从而触发了算法的执行。运行结果显示了算法框架中每个步骤的具体实现。

编辑 (opens new window)
#设计模式#行为型模式
上次更新: 2023/06/09, 13:17:31
策略模式(Strategy Pattern)
访问者模式(Visitor Pattern)

← 策略模式(Strategy Pattern) 访问者模式(Visitor Pattern)→

最近更新
01
ESP32-网络摄像头方案
06-14
02
ESP32-PWM驱动SG90舵机
06-14
03
ESP32-实时操作系统freertos
06-14
更多文章>
Theme by Vdoing | Copyright © 2019-2025 DC Wang All right reserved | 辽公网安备 21021102001125号 | 吉ICP备20001966号-2
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式