抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

组件协作:模板方法。

模型类型

组件协作

模板方法

定义一个操作中的算法的骨架(稳定),而将一些步骤(变化)放到子类中。模板方法使得子类不需要修改父类的结构(复用)即可重定义(override,重写)该算法中的某些特定步骤。

使用场景

一个算法骨架稳定,但其中一些步骤存在变化,可以使用模板方法。

举例

没有使用 template method

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Library
{
void step1() { ... }
void step3() { ... }
void step5() { ... }
};

class App
{
void step2() { ... }
void step4() { ... }
};

int main()
{
Library l();
App a();

l.step1();
a.step2();
l.step3();
a.step4();
l.step5();
}

使用 template method

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
32
33
34
35
36
37
38
class Library
{
void step1() { ... }
// 纯虚函数,子类实现
virtual void step2() = 0;
void step3() { ... }
// 纯虚函数,子类实现
virtual void step4() = 0;
void step5() { ... }

// 定义操作的算法骨架
// 稳定 template method
void run()
{
step1();
// 虚函数的多态调用
step2();
step3();
// 虚函数的多态调用
step4();
step5();
}

virtual ~Library() {}
};

class App : public Library
{
virtual void step2() { ... }
virtual void step4() { ... }
};

int main()
{
// 声明类型为父类,实际类型为子类
Library *l = new App();
l->run();
}