码迷,mamicode.com
首页 > 其他好文 > 详细

Template Pattern(模板模式)

时间:2014-07-22 22:36:32      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   color   os   

  • 模板方法(Template Method)模式:

  准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。模版方法模式是基于继承的代码复用的基本技术,模版方法模式的结构和用法也是面向对象设计的核心。

  模版方法模式需要开发抽象类和具体子类的设计师之间的协作。一个设计师负责给出一个算法的轮廓和骨架,另一些设计师则负责给出这个算法的各个逻辑步骤。代表这些具体逻辑步骤的方法称做基本方法(primitive method);而将这些基本法方法总汇起来的方法叫做模版方法(template method),这个设计模式的名字就是从此而来。

 
 
  • 模板方法模式的构造
 bubuko.com,布布扣
抽象模版(AbstractClass)角色有如下的责任:

  定义了一个或多个抽象操作,以便让子类实现。这些抽象操作叫做基本操作,它们是一个顶级逻辑的组成步骤。

  定义并实现了一个模版方法。这个模版方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。顶级逻辑也有可能调用一些具体方法。

具体模版(ConcreteClass)角色有如下的责任:

  实现父类所定义的一个或多个抽象方法,它们是一个顶级逻辑的组成步骤。

  每一个抽象模版角色都可以有任意多个具体模版角色与之对应,而每一个具体模版角色都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。

 

Template.h

bubuko.com,布布扣
 1 //Template.h
 2 # ifndef _TEMPLATE_H_
 3 # define _TEMPLATE_H_
 4 
 5 class AbstractClass
 6 {
 7 public:
 8     AbstractClass();
 9     virtual ~AbstractClass();
10     void TemplateMethod();
11 protected:
12     virtual void PrimitiveOperation1() = 0;
13     virtual void PrimitiveOperation2() = 0;
14 private:
15 };
16 
17 class ConcreteClass1:public AbstractClass
18 {
19 public:
20     ConcreteClass1();
21     ~ConcreteClass1();
22 protected:
23     void PrimitiveOperation1();
24     void PrimitiveOperation2();
25 private:
26 };
27 
28 class ConcreteClass2:public AbstractClass
29 {
30 public:
31     ConcreteClass2();
32     ~ConcreteClass2();
33 protected:
34     void PrimitiveOperation1();
35     void PrimitiveOperation2();
36 private:
37 };
38 
39 # endif
View Code

 

Template.cpp

bubuko.com,布布扣
 1 //Template.cpp
 2 # include <iostream>
 3 # include "Template.h"
 4 using namespace std;
 5 
 6 AbstractClass::AbstractClass()
 7 {
 8     cout << "Construct AbstractClass" << endl;
 9 }
10 AbstractClass::~AbstractClass()
11 {
12     cout << "Destruct AbstractClass" << endl;
13 }
14 void AbstractClass::TemplateMethod()
15 {
16     this->PrimitiveOperation1();
17     this->PrimitiveOperation2();
18 }
19 
20 ConcreteClass1::ConcreteClass1()
21 {
22     cout << "Construct ConcreteClass1" << endl;
23 }
24 ConcreteClass1::~ConcreteClass1()
25 {
26     cout << "Destruct ConcreteClass1" << endl;
27 }
28 void ConcreteClass1::PrimitiveOperation1()
29 {
30     cout << "ConcreteClass1::PrimitiveOperation1" << endl;
31 }
32 void ConcreteClass1::PrimitiveOperation2()
33 {
34     cout << "ConcreteClass1::PrimitiveOperation2" << endl;
35 }
36 
37 ConcreteClass2::ConcreteClass2()
38 {
39     cout << "Construct ConcreteClass2" << endl;
40 }
41 ConcreteClass2::~ConcreteClass2()
42 {
43     cout << "Destruct ConcreteClass2" << endl;
44 }
45 void ConcreteClass2::PrimitiveOperation1()
46 {
47     cout << "ConcreteClass2::PrimitiveOperation1" << endl;
48 }
49 void ConcreteClass2::PrimitiveOperation2()
50 {
51     cout << "ConcreteClass2::PrimitiveOperation2" << endl;
52 }
View Code

 

main.cpp

bubuko.com,布布扣
 1 //main.cpp
 2 # include <iostream>
 3 # include "Template.h"
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     AbstractClass *p1 = new ConcreteClass1();
 9     AbstractClass *p2 = new ConcreteClass2();
10     p1->TemplateMethod();
11     p2->TemplateMethod();
12     delete p1;
13     delete p2;
14     return 0;
15 }
View Code

 

result:

blank@linux-wang:~/Projects/Template> g++ -o a *.cpp && ./a
Construct AbstractClass
Construct ConcreteClass1
Construct AbstractClass
Construct ConcreteClass2
ConcreteClass1::PrimitiveOperation1
ConcreteClass1::PrimitiveOperation2
ConcreteClass2::PrimitiveOperation1
ConcreteClass2::PrimitiveOperation2
Destruct ConcreteClass1
Destruct AbstractClass
Destruct ConcreteClass2
Destruct AbstractClass

Template Pattern(模板模式),布布扣,bubuko.com

Template Pattern(模板模式)

标签:des   style   blog   http   color   os   

原文地址:http://www.cnblogs.com/blank031x/p/3861099.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!