11、跟学23种设计模式(C++版):模板方法模式

模板方法模式(Template Method Pattern)是一种行为设计模式,它定义了一个操作的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变算法结构的情况下,重新定义算法中的某些步骤。

模板方法特点

1、 代码复用:模板方法模式通过把通用的算法结构放在基类中,实现了代码的复用;
2、 灵活性:通过子类实现具体步骤,算法的具体实现可以在不影响整体结构的情况下发生变化;
3、 一致性:所有的具体实现都遵循相同的算法框架,保证了算法执行的一致性;
4、 易于维护:将公共部分提取到基类中,减少了代码的冗余,有助于代码的维护和扩展;

适用场景

1、 具有通用行为的算法:当你有一些通用行为的算法时,模板方法可以将通用部分提取到基类中,而具体部分由子类实现;
2、 复用代码:当你希望复用代码并只改变算法的某些具体步骤时,可以使用模板方法模式;
3、 控制子类扩展:当你需要控制子类的扩展行为,而不是让子类随意扩展时,可以使用模板方法模式;

C++案例

假设我们有一个制作咖啡和茶的程序。制作流程包括:烧水、冲泡、倒入杯中、加调料。咖啡和茶在加调料步骤上有所不同,我们可以使用模板方法模式来实现。

#include <iostream>

class CaffeineBeverage {
public:
    // 模板方法
    void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }

    virtual ~CaffeineBeverage() {}

protected:
    void boilWater() {
        std::cout << "Boiling water" << std::endl;
    }

    virtual void brew() = 0;

    void pourInCup() {
        std::cout << "Pouring into cup" << std::endl;
    }

    virtual void addCondiments() = 0;
};

class Tea : public CaffeineBeverage {
protected:
    void brew() override {
        std::cout << "Steeping the tea" << std::endl;
    }

    void addCondiments() override {
        std::cout << "Adding lemon" << std::endl;
    }
};

class Coffee : public CaffeineBeverage {
protected:
    void brew() override {
        std::cout << "Dripping coffee through filter" << std::endl;
    }

    void addCondiments() override {
        std::cout << "Adding sugar and milk" << std::endl;
    }
};

int main() {
    Tea tea;
    Coffee coffee;

    std::cout << "Making tea..." << std::endl;
    tea.prepareRecipe();

    std::cout << "Making coffee..." << std::endl;
    coffee.prepareRecipe();

    return 0;
}
  • 案例说明

CaffeineBeverage 是一个抽象基类,定义了制作饮料的算法骨架,即模板方法 prepareRecipe。该方法包含了制作饮料的几个步骤,并把冲泡和加调料的具体实现推迟到子类中。

  • Tea 和 Coffee 是具体的子类,分别实现了 brew 和 addCondiments 方法,这两个方法分别表示茶和咖啡的冲泡方式及调料添加方式。
  • 在 main 函数中,我们创建了 Tea 和 Coffee 的实例,并调用它们的 prepareRecipe 方法来制作茶和咖啡。

*

总结

模板方法模式是一种行为设计模式,通过将算法的一些步骤推迟到子类中实现,从而使得算法的整体结构保持不变,同时允许子类对具体步骤进行修改。它能够有效地提高代码的复用性和灵活性,确保算法执行的一致性和可维护性。在适当的场景下使用模板方法模式,可以显著简化代码的设计和实现。

END

今天是日更的第21/100天

封面照片:_丶

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: