意图:
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
适用环境:
1) 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
2) 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
3) 控制子类扩展。模板方法只在特定点调用“hook ”操作,这样就只允许在这些点进行扩展。
结构:
实现:
Template模式是采用继承的方式实现:将逻辑算法放在抽象基类中,并实现好细节的接口,子类中实现细节;Template 模式实际上就是面向对象中多态的概念实现算法细节和高层接口的松耦合。
而策略设计模式解决的是和Template模式类似的问题,但是策略模式是讲逻辑算法封装在一个类中,采用组合的方式解决这个问题;
AbstractClass.h
#pragma once
#include <iostream>
using namespace std;
class AbstractClass
{
public:
AbstractClass(void);
virtual ~AbstractClass(void);
void TemplateMethod();
protected:
virtual void PrimitiveOperation1()=0;
virtual void PrimitiveOperation2()=0;
};
class ConcreteClass1:public AbstractClass
{
public:
ConcreteClass1(void);
virtual ~ConcreteClass1(void);
void PrimitiveOperation1();
void PrimitiveOperation2();
}
AbstractClass.cpp
#include "StdAfx.h"
#include "AbstractClass.h"
AbstractClass::AbstractClass(void)
{
}
AbstractClass::~AbstractClass(void)
{
}
void AbstractClass::TemplateMethod()
{
this->PrimitiveOperation1();
this->PrimitiveOperation2();
}
ConcreteClass1::ConcreteClass1(void)
{
}
ConcreteClass1::~ConcreteClass1(void)
{
}
void ConcreteClass1::PrimitiveOperation1()
{
cout<<"operation 1"<<endl;
}
void ConcreteClass1::PrimitiveOperation2()
{
cout<<"operation 2"<<endl;
}
主函数:
//
#include "stdafx.h"
#include "AbstractClass.h"
int _tmain(int argc, _TCHAR* argv[])
{
AbstractClass *p1=new ConcreteClass1();
p1->TemplateMethod();
return 0;
}