Chapter7:模板方法模式
模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
既然用了继承,并且肯定这个继承有意义,就应该要成为子类的模板,所有重复的代码都应该要上升到父类去,而不是让每个子类都去重复。
当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法来处理。模板方法模式是通过把不变行为搬移到基类,去除子类中的重复代码来体现它的优势。模板方法模式就是提供了一个很好的代码复用平台。当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。
实际应用
工程结构
(1)抽象类AbstractClass.h
(2)具体类ConcreteClass.h
(3)客户端类TemplateMethodApp.cpp
(1)抽象类AbstractClass.h
#ifndef _ABSTRACT_CLASS_H_
#define _ABSTRACT_CLASS_H_
#include <iostream>
using namespace std;
class CAbstractClass
{
public:
virtual void PrimitiveOperationA() = 0;
virtual void PrimitiveOperationB() = 0;
void TemplateMethod()
{
PrimitiveOperationA();
PrimitiveOperationB();
cout << "Template method in abstract class" << endl;
}
};
#endif //_ABSTRACT_CLASS_H_
(2)具体类ConcreteClass.h
#ifndef _CONCRETE_CLASS_H_
#define _CONCRETE_CLASS_H_
#include "AbstractClass.h"
class CConcreteClassFirst : public CAbstractClass
{
public:
void PrimitiveOperationA()
{
cout << __FUNCTION__ << endl;
}
void PrimitiveOperationB()
{
cout << __FUNCTION__ << endl;
}
};
class CConcreteClassSecond : public CAbstractClass
{
public:
void PrimitiveOperationA()
{
cout << __FUNCTION__ << endl;
}
void PrimitiveOperationB()
{
cout << __FUNCTION__ << endl;
}
};
#endif //_CONCRETE_CLASS_H_
(3)客户端类TemplateMethodApp.cpp
// TemplateMethodApp.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "ConcreteClass.h"
int _tmain(int argc, _TCHAR* argv[])
{
CAbstractClass* pMethod = NULL;
pMethod = new CConcreteClassFirst();
pMethod->TemplateMethod();
pMethod = new CConcreteClassSecond();
pMethod->TemplateMethod();
delete pMethod;
pMethod = NULL;
system("pause");
return 0;
}