一、什么是模板方法模式?
模板方法(Template Method)是一种设计模式,属于行为型模式。它在父类中定义了一个算法的骨架,而将一些步骤延迟到子类中实现。模板方法模式可以让子类在不改变算法整体结构的情况下,重新定义算法中的某些步骤。
简而言之,就是父类定义了一系列步骤,即模板,子类需要严格按照模板步骤执行,但是每一步可以选择自己重新定义。
模板方法模式包含以下主要角色:
- AbstractClass - 抽象类,定义了一个模板方法,该方法包含了算法的骨架,也包含一些抽象方法(abstract operation)。
- ConcreteClass - 具体子类,实现抽象类中所定义的抽象方法,以完成算法中的某些步骤。
二、模板方法模式举例
在这里我们以建房子为例:
//定义一个抽象父类HouseBuilder
class HouseBuilder {
public:
buildHouse() {
buildFoundation(); // 地基
buildPillars(); // 支柱
buildWalls(); // 墙壁
buildWindows(); // 窗户
buildRoof(); // 房顶
}
protected:
//基本方法1,地基
virtual buildFoundation() = 0;
//基本方法2,支柱
virtual buildPillars() = 0;
//...
}
//木屋子具体实现
class WoodenHouseBuilder : public HouseBuilder {
protected:
buildFoundation() override {
//木屋子打地基具体实现
cout << "木屋子打地基" << endl;
}
buildPillars() override {
//木屋子建支柱具体实现
cout << "木屋子建支柱" << endl;
}
//...
}
//水泥屋子具体实现
class ConcreteHouseBuilder : public HouseBuilder {
protected:
buildFoundation() override {
//水泥屋子打地基具体实现
cout << "水泥屋子打地基" << endl;
}
buildPillars() override {
//水泥屋子建支柱具体实现
cout << "水泥屋子建支柱" << endl;
}
//...
}
客户端调用的时候:
int main() {
HouseBuilder* builder = new WoodenHouseBuilder(); // 父类指针指向子类对象
builder->buildHouse();
return 0;
}
模板方法模式能够封装不变部分,扩展可变部分。它在父类中定义了一个算法的骨架,而将一些可变的步骤留给子类实现,使得子类可以不改变算法结构的情况下重定义算法的某些特定步骤。这符合“开闭原则”。
总结
模板方法模式是设计模式中最基本的一种模式,需要大家掌握。
如果你有不同看法欢迎评论区交流!