设计模式:7. 模板方法模式

你开了一家饮品店,目前有两个饮品,制作步骤如下:

  1. 咖啡冲泡法
    a. 把水煮沸
    b. 用沸水冲泡咖啡
    c. 把咖啡倒进杯子
    d. 加糖和牛奶
  2. 茶冲泡法
    a. 把水煮沸
    b. 用沸水浸泡茶叶
    c. 把茶倒进杯子里
    d. 加柠檬
    可以看到,这两个饮品的制作方法大体上是一样的,只有第二步需要冲泡的东西和第四步加入的调料有所不同。其他两步“把水煮沸”和“倒进杯子”动作完全一样。
    我们可以把整个制作步骤设计成一个抽象类,制作成一个模板,相同的动作直接在抽象类中实现,而不同的部分,由子类自己实现。
class Beverage
{
public:
  void prepareRecipe()
  {
    boilWater();
    brew();
    pourInCup();
    addCondiments();
  }
  virtual void brew() = 0;
  virtual void addCondiments() = 0;
  void boilWater()
  {
    std::cout << "Boiling water" << std::endl;
  }
  void pourInCup()
  {
    std::cout << "Pouring into cup" << std::endl;
  }
};
class Tea: public Beverage
{
public:
  void brew() override
  {
    std::cout << "Steeping the tea" << std::endl;
  }
  void addCondiments() override
  {
    std::cout << "Adding Lemon" << std::endl;
  }
};
class Coffee: public Beverage
{
public:
  void brew() override
  {
    std::cout << "Dripping Coffee through filter" << std::endl;
  }
  void addCondiments() override
  {
    std::cout << "Adding Sugar and Milk" << std::endl;
  }
};

如果再有其他的饮品,也可以按照这个模板制作。
模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤

posted @ 2026-06-20 11:34  初五二十一  阅读(5)  评论(0)    收藏  举报