模板方法模式(Template Method Pattern)
# 模板方法模式(Template Method Pattern)
# 概念
模板方法模式是一种行为设计模式,它定义了一个操作的算法框架,将一些步骤的具体实现延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下重新定义算法中的某些步骤。
# 思想
模板方法模式基于"好莱坞原则",即"别调用我们,我们会调用你"。它通过定义一个抽象类,其中包含一个模板方法,该方法定义了算法的框架,然后通过具体的子类来实现模板方法中的具体步骤。
# 角色
- AbstractClass(抽象类):定义模板方法和一些抽象方法,表示算法的框架。
- ConcreteClass(具体类):实现抽象类中的抽象方法,提供算法的具体实现。
# 优点
- 提供了一种代码复用的方式,避免了重复代码的编写。
- 可以灵活地扩展和定制算法的特定步骤。
- 符合开闭原则,即通过扩展子类,可以改变算法的行为,而无需修改抽象类的代码。
# 缺点
- 模板方法模式在某种程度上限制了子类的灵活性,因为模板方法的结构已经定义好了,子类只能根据模板方法的结构进行实现。
- 如果算法的框架发生改变,可能需要修改抽象类的代码和所有的子类。
# 类图
@startuml
class AbstractClass {
+templateMethod(): void
-abstractMethod1(): void
-abstractMethod2(): void
}
class ConcreteClass {
+abstractMethod1(): void
+abstractMethod2(): void
}
AbstractClass <|-- ConcreteClass
note right of AbstractClass: 模板方法模式\nTemplate Method Pattern
@enduml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 示例代码
下面是一个使用C++实现的模板方法模式的示例代码:
#include <iostream>
class AbstractClass {
public:
void templateMethod() {
// 执行算法的框架
step1();
step2();
step3();
}
virtual ~AbstractClass() {}
protected:
virtual void step1() = 0;
virtual void step2() = 0;
virtual void step3() = 0;
};
class ConcreteClass : public AbstractClass {
protected:
void step1() override {
std::cout << "ConcreteClass: Step 1" << std::endl;
}
void step2() override {
std::cout << "ConcreteClass: Step 2" << std::endl;
}
void step3() override {
std::cout << "ConcreteClass: Step 3" << std::endl;
}
};
int main() {
AbstractClass* client = new ConcreteClass();
client->templateMethod();
delete client;
return 0;
}
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
39
40
41
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
39
40
41
代码运行结果:
ConcreteClass: Step 1
ConcreteClass: Step 2
ConcreteClass: Step 3
1
2
3
2
3
上述示例代码中,抽象类AbstractClass
定义了一个模板方法templateMethod
,该方法表示算法的框架,并调用了三个抽象方法step1
、step2
和step3
。具体类ConcreteClass
继承抽象类,并实现了这三个抽象方法。在main
函数中,创建了一个ConcreteClass
对象,并调用了templateMethod
方法,从而触发了算法的执行。运行结果显示了算法框架中每个步骤的具体实现。
编辑 (opens new window)
上次更新: 2023/06/09, 13:17:31
- 01
- Linux系统移植(五)--- 制作、烧录镜像并启动Linux02-05
- 03
- Linux系统移植(三)--- Linux kernel移植02-05