模板方法模式(Template Method)

参考:

模板方法设计模式 (refactoringguru.cn)

design-patterns-cpp/TemplateMethod.cpp at master · JakubVojvoda/design-patterns-cpp · GitHubhttps://github.com/JakubVojvoda/design-patterns-cpp/blob/master/state/State.cpp)

文章目录

    • 一、什么是模板方法模式?
    • 二、实现
    • 三、优缺点
      • 优点
      • 缺点
    • 四、适用环境
    • 五、与其他模式的关系

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

模板方法模式定义:是一种行为设计模式,它在超类中定义了一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤。

如在构建造房屋时,有一些基本的步骤,例如打地基、 建造框架、 建造墙壁和安装水电管线等。标准房屋建造方案中可提供几个扩展点,允许潜在房屋业主调整成品房屋的部分细节。使得成品房屋会略有不同。

模板方法模式(Template Method)_第1张图片

二、实现

模板方法(Template Method)模式包含以下主要角色:

1、抽象类(Abstract­ Class):会声明作为算法步骤的方法,以及依次调用它们的实际模板方法。算法步骤可以被声明为抽象类型,也可以提供一些默认实现。
2、具体类(Concrete­ Class):可以重写所有步骤, 但不能重写模板方法自身。

模板方法模式(Template Method)_第2张图片

/*
 * C++ Design Patterns: Template Method
 * Author: Jakub Vojvoda [github.com/JakubVojvoda]
 * 2016
 *
 * Source code is licensed under MIT License
 * (for more details see LICENSE)
 *
 */

#include 

/*
 * AbstractClass
 * implements a template method defining the skeleton of an algorithm
 */
class AbstractClass
{
public:
  virtual ~AbstractClass() {}
  
  void templateMethod()
  {
    // ...
    primitiveOperation1();
    // ...
    primitiveOperation2();
    // ...
  }
  
  virtual void primitiveOperation1() = 0;
  virtual void primitiveOperation2() = 0;
  // ...
};

/*
 * Concrete Class
 * implements the primitive operations to carry out specific steps
 * of the algorithm, there may be many Concrete classes, each implementing
 * the full set of the required operation
 */
class ConcreteClass : public AbstractClass
{
public:
  ~ConcreteClass() {}
  
  void primitiveOperation1()
  {
    std::cout << "Primitive operation 1" << std::endl;
    // ...
  }
  
  void primitiveOperation2()
  {
    std::cout << "Primitive operation 2" << std::endl;
    // ...
  }
  // ...
};


int main()
{
  AbstractClass *tm = new ConcreteClass;
  tm->templateMethod();
  
  delete tm;
  return 0;
}

三、优缺点

优点

  • 你可仅允许客户端重写一个大型算法中的特定部分,使得算法其他部分修改对其所造成的影响减小。
  • 你可将重复代码提取到一个超类中。

缺点

  • 部分客户端可能会受到算法框架的限制。
  • 通过子类抑制默认步骤实现可能会导致违反里氏替换原则。
  • 只要算法发生变化,你就可能需要修改所有的类。

四、适用环境

  • 当你只希望客户端扩展某个特定算法步骤,而不是整个算法或其结构时,可使用模板方法模式。
  • 当多个类的算法除一些细微不同之外几乎完全一样时,你可使用该模式。

五、与其他模式的关系

  • 工厂方法模式模板方法模式的一种特殊形式。同时,工厂方法可以作为一个大型模板方法中的一个步骤。
  • 模板方法基于继承机制: 它允许你通过扩展子类中的部分内容来改变部分算法。 策略模式基于组合机制: 你可以通过对相应行为提供不同的策略来改变对象的部分行为。模板方法在类层次上运作,因此它是静态的。策略在对象层次上运作, 因此允许在运行时切换行为。

你可能感兴趣的:(设计模式,模板方法模式,c++,设计模式)