作用:
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
UML结构图:
抽象基类:
1)AbstractClass:抽象基类,定义算法的轮廓
解析:
TemplateMethod 的关键在于在基类中定义了一个算法的轮廓,但是算法每一步具体的实现留给了派生类.但是这样也会造成设计的灵活性不高的缺点,因为轮廓已经定下来了要想改变就比较难了,这也是为什么优先采用聚合而不是继承的原因.
实现:
#ifndef TEMPLATEMETHOD_H_
#define TEMPLATEMETHOD_H_
class AbstractClass
{
public:
AbstractClass(){}
virtual~ AbstractClass(){}
void TemplateMethod();
protected:
virtual void PrimitiveOperation1() = 0;
virtual void PrimitiveOperation2() = 0;
};
class ConcreateClass : public AbstractClass
{
public:
ConcreateClass(){}
virtual~ ConcreateClass(){}
protected:
virtual void PrimitiveOperation1();
virtual void PrimitiveOperation2();
};
#endif
#include "stdafx.h"
#include "TemplateMethod.h"
#include <iostream>
using namespace std;
void AbstractClass::TemplateMethod()
{
PrimitiveOperation1();
PrimitiveOperation2();
}
void ConcreateClass::PrimitiveOperation1()
{
cout<<"ConcreateClass::PrimitiveOperation1"<<endl;
}
void ConcreateClass::PrimitiveOperation2()
{
cout<<"ConcreateClass::PrimitiveOperation2"<<endl;
}
#include "stdafx.h"
#include "TemplateMethod.h"
#include <iostream>
#include <stdlib.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
AbstractClass* lpAbsClass = new ConcreateClass;
lpAbsClass->TemplateMethod();
delete lpAbsClass;
lpAbsClass = NULL;
system("pause");
return 0;
}