模板方法
- Template Method
特点:
- 稳定的机构,但是子步骤有很多改变的需求。
- 或者由于固有原因导致无法和任务的整体结构同时实现
目的:
在稳定结构的前提下,灵活实现变化或者晚期再来实现需求
Template Method
例子
- 程序库开发人员
1
2
3
4
5
6
7
8
9
10
11
12class Libaray{
public:
void Step1(){
//
}
void Step3(){
//
}
void Step5(){
//
}
} - 应用开发人员
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25class Application{
public:
bool Step2(){
}
void Step4(){
}
}
int main(){
Libaray lib();
Application app();
lib.Step1();
if(app.Step2()){
lib.Step3();
}
for(int i=0;i<4;i++){
app.Step4();
}
lib.Step5();
}
改进
程序库开发人员
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32class Libaray{
public:
void run(){
Step1();
if(Step2()){
Step3();
}
for(int i=0;i<4;i++){
Step4();
}
Step5();
}
virtual ~Library(){}
protected:
void Step1(){
//
}
void Step3(){
//
}
void Step5(){
//
}
virtual bool Step2()=0;
virtual void Step4()=0;
}应用程序开发人员
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15class Application:public Libaray{
protected:
bool Step2(){
}
void Step4(){
}
}
int main(){
Library* pLib = new Application();
pLib->run();
delete pLib;
}
区别
- Application call Library 早绑定
- Library call Application 晚绑定
定义
定义一个操作中的算法的骨架 (稳定),而将一些步骤延迟 (变化) 到子类中。Template Method 使得子类可以不改变 (复用) 一个算法的结构即可重定义 (override 重写) 该算法的某些特定步骤
UML 表示
要点
- Template Method 模式,是一种非常基础的设计模式,他用最简洁的机制(虚函数)为很多应用程序框架提供了灵活的扩展点,是代码结构实现复用
- 除了可以灵活对应子步骤的变化外,“不要调用我”,“让我调用你”的反向控制结构是Template Method的典型
- 在具体实现方面,被Template Method 调用的虚函数可以有实现也可以没有实现(抽象方法,纯虚方法)他们设置为protected 方法。
- 因为虚函数需要在一定的流程内使用才有意义。因此一般并不提供出去