(行为型模式)Template Method——模板方法模式

1、意图

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。template method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤

2、核心思想

     模板方法模式准备一个抽象类,将部分逻辑以具体方法以及具体构造子类的形式实现,然后声明一些抽象方法来迫使子类剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。

     当要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,通常考虑用模板方法来处理。也就是说:有时候,我们遇到由一系列步骤构成的过程需要执行。这个过程从高层次上看是相同的,但从底层看有些具体步骤实现又可能不同,这时候,就要考虑使用模板方法模式。

3、优缺点分析

GOOD:

把不变的代码部分都转移到父类中,将可变的代码用virtual留到子类重写,从而提供了一个很好的代码复用平台

即当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。我们就可以通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。

4、标准UML图

clip_image002

抽象基类:

AbstractClass:其实就是一抽象模板,定义并实现了一个模板方法。

派生子类:

ConcreateClass:实现抽象基类所定义的一个或多个抽象逻辑组成部分方法(在顶级逻辑框架中被调用的,也就是顶级逻辑的组成步骤)。

每个AbstractClass都可以有任意多个ConcreateClass与之对应,而每一个ConcreteClass都可以给出这些抽象方法的不同实现,从而使得顶级逻辑的实现各不相同。

接口函数:

TemplateMethod:一般是一个具体的方法,给出了顶级逻辑的框架。在此框架中将调用各个的具体函数即逻辑的组成步骤,分别在相应的抽象操作中,推迟到子类实现。

5、标准源码

   1: // 抽象基类,定义算法的轮廓
   2: class AbstractClass
   3: {
   4: public:
   5:     AbstractClass(){}
   6:     virtual ~AbstractClass(){}
   7:  
   8:     // 这个函数中定义了算法的轮廓
   9:     void TemplateMethod();
  10:  
  11: protected:
  12:     // 纯虚函数,由派生类实现之
  13:     virtual void PrimitiveOperation1() = 0;
  14:     virtual void PrimitiveOperation2() = 0;
  15: };
  16:  
  17: // 继承自AbstractClass,实现算法
  18: class ConcreateClass
  19:     : public AbstractClass
  20: {
  21: public:
  22:     ConcreateClass(){}
  23:     virtual ~ConcreateClass(){}
  24:  
  25: protected:
  26:     virtual void PrimitiveOperation1();
  27:     virtual void PrimitiveOperation2();
  28: };
   1: #include "TemplateMethod.h"
   2: #include <iostream>
   3:  
   4: void AbstractClass::TemplateMethod()
   5: {
   6:     PrimitiveOperation1();
   7:     PrimitiveOperation2();
   8: }
   9:  
  10: void ConcreateClass::PrimitiveOperation1()
  11: {
  12:     std::cout << "PrimitiveOperation1 by ConcreateClass\n";
  13: }
  14:  
  15: void ConcreateClass::PrimitiveOperation2()
  16: {
  17:     std::cout << "PrimitiveOperation2 by ConcreateClass\n";
  18: }
   1: int main()
   2: {
   3:     AbstractClass* pConcreateClass = new ConcreateClass;
   4:     pConcreateClass->TemplateMethod();
   5:  
   6:     delete pConcreateClass;
   7:  
   8:     system("pause");
   9:  
  10:     return 0;
  11: }
posted @ 2010-05-31 08:56  红脸书生  阅读(498)  评论(0编辑  收藏  举报