设计模式(1):模板方法模式

模板方法模式是一种行为型设计模式,它在抽象类中定义了一个算法的骨架,允许子类在不改变算法整体结构的情况下重定义某些步骤。例如,在建房子的例子中,抽象类`HouseBuilder`定义了建造房屋的流程,而`WoodenHouseBuilder`和`ConcreteHouseBuilder`分别实现具体的建造步骤,如打地基和建支柱。这种模式遵循“开闭原则”,封装不变部分并扩展可变部分。
摘要由CSDN通过智能技术生成

一、什么是模板方法模式?

模板方法(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;
}

模板方法模式能够封装不变部分,扩展可变部分。它在父类中定义了一个算法的骨架,而将一些可变的步骤留给子类实现,使得子类可以不改变算法结构的情况下重定义算法的某些特定步骤。这符合“开闭原则”。

总结

模板方法模式是设计模式中最基本的一种模式,需要大家掌握。

如果你有不同看法欢迎评论区交流!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值