模板方法模式
Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.(定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。)
UML类图
C++代码实现
#include <iostream>
using namespace std;
class AbstractClass {
public:
virtual void TemplateMethod() {
DoSomething();
DoAnything();
}
protected:
virtual void DoSomething() = 0;
virtual void DoAnything() = 0;
};
class ConcreteClass_A : public AbstractClass {
protected:
void DoSomething() { cout << "call ConcreteClass_A::DoSomething()" << endl; }
void DoAnything() { cout << "call ConcreteClass_A::DoAnything()" << endl; }
};
class ConcreteClass_B : public AbstractClass {
protected:
void DoSomething() { cout << "call ConcreteClass_B::DoSomething()" << endl; }
void DoAnything() { cout << "call ConcreteClass_B::DoAnything()" << endl; }
};
#include "Template.h"
int main()
{
AbstractClass* pTemple1 = new ConcreteClass_A();
AbstractClass* pTemple2 = new ConcreteClass_B();
pTemple1->TemplateMethod();
pTemple2->TemplateMethod();
delete pTemple1;
delete pTemple2;
return 0;
}
抽象是所有子类的共性封装。
如果相同的一段代码拷贝过2次,就需要对设计产生怀疑。
Template 是采用继承的方式实现算法的异构,其关键点就是将通用算法封装在抽象基类中,并将不同的算法细节放到子类中实现。
Template 模式获得一种反向控制结构效果,这也是面向对象系统的分析和设计中一个原则DIP(依赖倒置)。其含义就是父类调用子类的操作 (高层模块调用低层模块的操作),低层模块实现高层模块声明的接口。这样控制权在父类(高层模块),低层模块反而要依赖高层模块。