参考:
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、抽象类(Abstract Class):会声明作为算法步骤的方法,以及依次调用它们的实际模板方法。算法步骤可以被声明为抽象类型,也可以提供一些默认实现。
2、具体类(Concrete Class):可以重写所有步骤, 但不能重写模板方法自身。
/*
* 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 <iostream>
/*
* 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;
}
三、优缺点
优点
- 你可仅允许客户端重写一个大型算法中的特定部分,使得算法其他部分修改对其所造成的影响减小。
- 你可将重复代码提取到一个超类中。
缺点
- 部分客户端可能会受到算法框架的限制。
- 通过子类抑制默认步骤实现可能会导致违反里氏替换原则。
- 只要算法发生变化,你就可能需要修改所有的类。
四、适用环境
- 当你只希望客户端扩展某个特定算法步骤,而不是整个算法或其结构时,可使用模板方法模式。
- 当多个类的算法除一些细微不同之外几乎完全一样时,你可使用该模式。
五、与其他模式的关系
工厂方法模式
是模板方法模式
的一种特殊形式。同时,工厂方法
可以作为一个大型模板方法
中的一个步骤。模板方法
基于继承机制: 它允许你通过扩展子类中的部分内容来改变部分算法。策略模式
基于组合机制: 你可以通过对相应行为提供不同的策略来改变对象的部分行为。模板方法
在类层次上运作,因此它是静态的。策略
在对象层次上运作, 因此允许在运行时切换行为。