算法意圖:
將算法骨架定義在父類當(dāng)中,具體的實(shí)現(xiàn)放到子類當(dāng)中。Template method可以不改變算法的骨架在子類中重新定義算法中的某些特定的步驟。
算法適用性:
1. 一次性將算法的不變部分封裝到父類當(dāng)中,將可變的部分放到子類中去實(shí)現(xiàn)。
2. 各子類的公共部分亞冠提取出來放到父類當(dāng)中,避免代碼重復(fù),分離變化和不變的地方。
3. 通過hook來控制子類的擴(kuò)展。
4. 模板方法的格式:
class TemplateMethod_Demo
{
public:
<返回值類型> <模板方法名>(<參數(shù)列表>); //模板方法成員函數(shù),定義為公有的非虛成員函數(shù),供客戶調(diào)用;
protected:
virtual <返回值類型> <抽象操作的方法名>(<參數(shù)列表>) = 0;//抽象操作(可選),即:原語操作,用純虛函數(shù)表示,必須被重定義,定義為保護(hù)類型的,只能被模板方法本身調(diào)用;
virtual <返回值類型> <鉤子操作的方法名>(<參數(shù)列表>){}; //鉤子操作(必選),即:原語操作,用虛函數(shù)表示,可被重定義,提供缺省實(shí)現(xiàn),定義為保護(hù)類型的,只能被模板方法本身調(diào)用;
};
1
// template.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
2
//
3
4
#include "stdafx.h"
5
#include<iostream>
6
using namespace std;
7
8
class AbstractClass
9

{
10
public:
11
AbstractClass()
{}
12
virtual ~AbstractClass()
{}
13
virtual void doFirst();
14
virtual void doAfter();
15
// 這個(gè)函數(shù)中定義了算法的輪廓
16
void TemplateMethod()
17
{
18
doFirst();
19
PrimitiveOperation1();
20
PrimitiveOperation2();
21
if (b_jugle)
22
{
23
doSthElse();
24
}
25
doAfter();
26
}
27
virtual void setHookTrue()
28
{
29
AbstractClass::b_jugle = true;
30
};
31
32
protected:
33
// 純虛函數(shù),由派生類實(shí)現(xiàn)之
34
virtual void PrimitiveOperation1() = 0;
35
virtual void PrimitiveOperation2() = 0;
36
virtual void doSthElse() = 0;
37
static bool b_jugle;
38
39
40
};
41
42
bool AbstractClass::b_jugle = false;
43
44
45
void AbstractClass::doFirst()
46

{
47
cout<<"do std before"<<endl;
48
}
49
50
void AbstractClass::doAfter()
51

{
52
cout<<"do std after"<<endl;
53
}
54
55
// 繼承自AbstractClass,實(shí)現(xiàn)算法
56
class ConcreateClass: public AbstractClass
57

{
58
public:
59
ConcreateClass()
{}
60
virtual ~ConcreateClass()
{}
61
62
protected:
63
virtual void PrimitiveOperation1()
64
{
65
cout << "PrimitiveOperation1 by ConcreateClass\n";
66
}
67
virtual void PrimitiveOperation2()
68
{
69
cout << "PrimitiveOperation2 by ConcreateClass\n";
70
}
71
virtual void doSthElse()
72
{
73
cout<<"so something else!\n"<<endl;
74
}
75
};
76
77
78
// 繼承自AbstractClass,實(shí)現(xiàn)算法
79
class ConcreateClassNew: public AbstractClass
80

{
81
public:
82
ConcreateClassNew()
{}
83
virtual ~ConcreateClassNew()
{}
84
85
protected:
86
virtual void PrimitiveOperation1()
87
{
88
cout << "PrimitiveOperation1 by ConcreateClassNew\n";
89
}
90
virtual void PrimitiveOperation2()
91
{
92
cout << "PrimitiveOperation2 by ConcreateClassNew\n";
93
}
94
virtual void doSthElse()
95
{
96
cout<<"so something else!\n"<<endl;
97
}
98
99
};
100
101
102
int _tmain(int argc, _TCHAR* argv[])
103

{
104
AbstractClass* pConcreateClass = new ConcreateClass;
105
pConcreateClass->TemplateMethod();
106
delete pConcreateClass;
107
108
109
AbstractClass* pConcreateClass2 = new ConcreateClassNew;
110
pConcreateClass2->setHookTrue();
111
pConcreateClass2->TemplateMethod();
112
delete pConcreateClass2;
113
return 0;
114
}
115
116
運(yùn)行結(jié)果:
template method的設(shè)計(jì)原則:
1.封裝變化部分;
2.對(duì)接口編程
3. 好萊塢原則:別調(diào)用我們,在我們需要時(shí)會(huì)調(diào)用你
最后談一下和策略模式的區(qū)別,最主要的區(qū)別是一個(gè)是使用繼承而策略模式是使用組合方式。