设计模式-模板方法

模板方法模式(Template Method)

一、什么是模板方法模式

模板方法模式是一种行为型设计模式,它在抽象类中定义算法的骨架(框架),并允许子类实现或重写其中的具体步骤。

二、解决了什么问题

  • 当一个通用流程在多个子类中相似,但细节又有所不同时,可以使用模板方法来复用流程、统一规范。
  • 避免子类完全独立实现一整套流程造成的重复代码。

三、模式的核心思想

  • 在抽象类中写好 模板方法(流程框架)。
  • 将流程中的某些步骤定义为抽象方法,交由子类实现。
  • 一些通用步骤可以写死在抽象类中,避免重复。

四、结构图

抽象类 AbstractClass
    ├── 模板方法 templateMethod()  // 定义算法框架
    ├── 基本方法 step1()          // 子类可实现
    └── 基本方法 step2()          // 子类可实现

具体类 ConcreteClassA
    └── 实现 step1() 和 step2()

具体类 ConcreteClassB
    └── 实现 step1() 和 step2()

在这里插入图片描述

五、代码样例

  • 场景:做一杯饮料(泡茶 / 冲咖啡)
  • 需求:流程基本相同(烧水 → 倒杯子 → 加主料 → 加调料)

不使用设计模式

#include <iostream>
using namespace std;

class Tea {
public:
    void makeTea() {
        boilWater();
        pourInCup();
        addTeaLeaves();
        addLemon();
    }
private:
    void boilWater() { cout << "烧水\n"; }
    void pourInCup() { cout << "倒入茶杯\n"; }
    void addTeaLeaves() { cout << "加入茶叶\n"; }
    void addLemon() { cout << "加柠檬\n"; }
};

class Coffee {
public:
    void makeCoffee() {
        boilWater();
        pourInCup();
        addCoffeePowder();
        addSugar();
    }
private:
    void boilWater() { cout << "烧水\n"; }
    void pourInCup() { cout << "倒入咖啡杯\n"; }
    void addCoffeePowder() { cout << "加入咖啡粉\n"; }
    void addSugar() { cout << "加糖\n"; }
};

int main() {
    Tea tea;
    Coffee coffee;

    cout << "制作茶:\n";
    tea.makeTea();

    cout << "\n制作咖啡:\n";
    coffee.makeCoffee();
    return 0;
}

会发现几个问题

  • 重复代码很多(烧水、倒杯子等步骤)。
  • 如果流程要改(比如加「冷却」步骤),所有类都要改。

使用设计模式

#include <iostream>
using namespace std;

// 抽象饮料类(模板)
class Beverage {
public:
    virtual ~Beverage() {}

    void make() {  // 模板方法
        boilWater();
        pourInCup();
        addMainIngredient();
        addCondiments();
    }

protected:
    void boilWater() { cout << "烧水\n"; }
    void pourInCup() { cout << "倒入杯子\n"; }

    virtual void addMainIngredient() = 0;  // 留给子类实现
    virtual void addCondiments() = 0;      // 留给子类实现
};

// 具体类:茶
class Tea : public Beverage {
protected:
    void addMainIngredient() override { cout << "加入茶叶\n"; }
    void addCondiments() override { cout << "加柠檬\n"; }
};

// 具体类:咖啡
class Coffee : public Beverage {
protected:
    void addMainIngredient() override { cout << "加入咖啡粉\n"; }
    void addCondiments() override { cout << "加糖\n"; }
};

int main() {
    // 使用父类指针指向子类对象
    Beverage* beverage1 = new Tea();
    Beverage* beverage2 = new Coffee();

    cout << "制作茶:\n";
    beverage1->make();

    cout << "\n制作咖啡:\n";
    beverage2->make();

    // 释放内存
    delete beverage1;
    delete beverage2;

    return 0;
}

稳定与变化

在模板方法模式里:

  • 稳定的部分

    • Beverage(抽象饮料类)里定义的流程:
      • 烧水 → 倒杯子 → 加主料 → 加调料
    • 这些步骤的顺序和整体框架是 固定不变 的。
  • 变化的部分

    • 不同饮品的细节实现:
      • 茶:加入茶叶,加柠檬
      • 咖啡:加入咖啡粉,加糖
      • 热巧克力:加入巧克力粉,加牛奶
    • 这些属于 容易变化 的部分,由子类来实现。

变化依赖于稳定

模板方法模式的核心思想就是:

  • 流程(稳定) → 写在父类(Beverage)中,保证整体框架不会乱。
  • 细节(变化) → 交给子类(TeaCoffee 等)实现,保证可以灵活扩展。

这样一来:

  • 如果以后要新增饮品(比如奶茶),只需要写一个新的子类继承 Beverage,而不用修改原有代码。
  • 稳定部分(流程)不会被破坏,变化部分(实现)可以不断增加。

一句话总结
模板方法模式就是通过 “变化依赖于稳定” 来实现可复用和可扩展。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值