设计模式(八):模板模式
定义:
·定义一个操作中的算法框架,将一些步骤延迟到子类中。子类在不改变框架的前提下就可以重新定义某些特定步骤
主要解决:
·一些方法通用,却在每一个子类都重新写了这一方法。
如何解决:
·将这些通用算法抽象出来。在抽象类实现,其他步骤在子类实现
以代码为例:
关系类图如下
一、定义AbstractClass
#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;
// ...
};
即AbstractClass抽象了通用算法primitiveOperation1() 和virtual void primitiveOperation2()。
类中方法void templateMethod()即为模板
二、实现AbstractClass类
class ConcreteClass : public AbstractClass
{
public:
~ConcreteClass() {}
void primitiveOperation1()
{
std::cout << "Primitive operation 1" << std::endl;
// ...
}
void primitiveOperation2()
{
std::cout << "Primitive operation 2" << std::endl;
// ...
}
// ...
};
三、main函数调用
int main()
{
AbstractClass *tm = new ConcreteClass;
tm->templateMethod();
delete tm;
return 0;
}
运行结果为:
Primitive operation 1
Primitive operation 2
模板模式优缺点
优点:
1、封装不变部分,扩展可变部分。
2、提取公共代码,便于维护。
3、行为由父类控制,子类实现。
缺点:
1、每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
注意事项:
1、策略模式和模板方法模式都封装算法,一个用组合,一个用继承。
2、工厂方法是模板方法的一种特殊版本。
3、抽象方法由子类来实现