设计模式的理会和实现(C++)之十一-TemplateMethod模式
副标题#e#
浸染:
界说一个操纵中的算法的骨架,而将一些步调延迟到子类中。TemplateMethod 使得子类可以不改变一个算法的布局即可重界说该算法的某些特定步调。
UML布局图:
抽象基类:
1)AbstractClass:抽象基类,界说算法的表面
理会:
TemplateMethod 的要害在于在基类中界说了一个算法的表面,可是算法每一步详细的实现留给了派生类.可是这样也会造成设计的机动性不高的缺点,因为表面已经定下来了要想改变就较量难了,这也是为什么优先回收聚合而不是担任的原因.
实现:
1)TemplateMethod.h
/**//********************************************************************
created: 2006/07/20
filename: TemplateMethod.h
author: 李创
http://www.cppblog.com/converse/
purpose: TemplateMethod模式的演示代码
*********************************************************************/
// 抽象基类,界说算法的表面
class AbstractClass
{
public:
AbstractClass(){}
virtual ~AbstractClass(){}
// 这个函数中界说了算法的表面
void TemplateMethod();
protected:
// 纯虚函数,由派生类实现之
virtual void PrimitiveOperation1() = 0;
virtual void PrimitiveOperation2() = 0;
};
// 担任自AbstractClass,实现算法
class ConcreateClass
: public AbstractClass
{
public:
ConcreateClass(){}
virtual ~ConcreateClass(){}
protected:
virtual void PrimitiveOperation1();
virtual void PrimitiveOperation2();
};
#p#副标题#e#
2)TemplateMethod.cpp
/**//********************************************************************
created: 2006/07/20
filename: TemplateMethod.cpp
author: 李创
http://www.cppblog.com/converse/
purpose: TemplateMethod模式的演示代码
*********************************************************************/
#include "TemplateMethod.h"
#include <iostream>
void AbstractClass::TemplateMethod()
{
PrimitiveOperation1();
PrimitiveOperation2();
}
void ConcreateClass::PrimitiveOperation1()
{
std::cout << "PrimitiveOperation1 by ConcreateClass\n";
}
void ConcreateClass::PrimitiveOperation2()
{
std::cout << "PrimitiveOperation2 by ConcreateClass\n";
}
3)Main.cpp
/**//********************************************************************
created: 2006/07/20
filename: Main.cpp
author: 李创
http://www.cppblog.com/converse/
purpose: TemplateMethod模式的测试代码
*********************************************************************/
#include "TemplateMethod.h"
#include <stdlib.h>
int main()
{
AbstractClass* pConcreateClass = new ConcreateClass;
pConcreateClass->TemplateMethod();
delete pConcreateClass;
system("pause");
return 0;
}