当我们要完成在某一细节层次上一致的一个过程或一系列步骤,但在其个别步骤的一个更详细层次上实现不同时,可以考虑使用模板方法模式。
模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变算法的结构即可重定义算法的某些特定步骤。
AbstractClass是一个抽象类,其实就是一个抽象模板,定义并实现了一个模板方法,这个模板方法一般一个具体的方法,他给出了一个顶级的逻辑框架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类中实现。顶级逻辑也有可能调用一些具体的方法。
模板方法模式通过把不变行为搬移到超类,去除子类中重复代码来体现他的优势。
代码:
//Template.h
#include "stdafx.h"
class AbstractMethod
{
private:
virtual void pro1()=0;
virtual void pro2()=0;
public:
void MethodPro();
};
class ConcreteMethod1 :public AbstractMethod
{
private:
virtual void pro1();
virtual void pro2();
};
class ConcreteMethod2 :public AbstractMethod
{
private:
virtual void pro1();
virtual void pro2();
};
//Template.cpp
#include "stdafx.h"
#include "Template.h"
#include <iostream>
using namespace std;
void AbstractMethod ::MethodPro()
{
cout << "pro1 run:";
pro1();
cout << "pro2 run:";
pro2();
cout << "Method end"<<endl;
}
void ConcreteMethod1 ::pro1()
{
cout << "ConcreteMethod1::pro1" << endl;
}
void ConcreteMethod1 ::pro2()
{
cout << "Concretemethod1::pro2" << endl;
}
void ConcreteMethod2 ::pro1()
{
cout << "ConcreteMethod2::pro1" << endl;
}
void ConcreteMethod2 ::pro2()
{
cout << "Concretemethod2::pro2" << endl;
}
//
TemplateMethod.cpp
// TemplateMethod.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "Template.h"
int _tmain (int argc , _TCHAR * argv [])
{
AbstractMethod*me = new ConcreteMethod1 ();
me->MethodPro();
me = new ConcreteMethod2();
me->MethodPro();
getchar();
return 0;
}