设计模式之模板方法模式
模板方法模式,定义一个操作中的算法的股价,而将一些步骤延迟到了子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。说白了就是有一个算法有很多部分,这个算法在基类中已经定义好了。而算法中的各个部分都写成各个成员函数了。然后在子类中可以覆盖这些成员函数,从而实现不同的算法。
其UML图如下:
在AbstractClass中有个TemplateMethod()方法,该方法定义了一个算法,在该算法中调用了其他的成员方法,这些成员方法组成了整个算法的各个部分。而这这些成员方法则可以根据子类的不同实现而可以改变。
示例代码如下:
1 // TemplateModel.h文件
2 #pragma once
3 #include <iostream>
4
5 class AbstractClass
6 {
7 public:
8 // 定义了一个算法模板
9 void templateMethod()
10 {
11 std::cout << "Operation 0" << std::endl;
12 primitiveOperation_0();
13 std::cout << "Operation 1" << std::endl;
14 primitiveOperation_1();
15 }
16 protected:
17 virtual void primitiveOperation_0() = 0;
18 virtual void primitiveOperation_1() = 0;
19 };
20
21 class ConcreteClass_0 : public AbstractClass
22 {
23 protected:
24 virtual void primitiveOperation_0()
25 {
26 std::cout << "ConcreteClass_0 Operation_0" << std::endl;
27 }
28 virtual void primitiveOperation_1()
29 {
30 std::cout << "ConcreteClass_0 Operation_1" << std::endl;
31 }
32 };
33
34 class ConcreteClass_1 : public AbstractClass
35 {
36 protected:
37 virtual void primitiveOperation_0()
38 {
39 std::cout << "ConcreteClass_1 Operation_0" << std::endl;
40 }
41 virtual void primitiveOperation_1()
42 {
43 std::cout << "ConcreteClass_1 Operation_1" << std::endl;
44 }
45 };
测试代码如下:
1 #include <iostream>
2 #include "TemplateModel.h"
3
4 int main()
5 {
6 using namespace std;
7 // 模板方法模式
8 AbstractClass *p = new ConcreteClass_0();
9 p->templateMethod();
10 delete p;
11
12 p = new ConcreteClass_1();
13 p->templateMethod();
14 delete p;
15
16 getchar();
17 return 0;
18 }
测试结果如下图:
模板方法模式就是提供了一个很好的代码复用平台。因为有时候,我们会遇到由一系列步骤构成的过程需要执行。这个过程从高层次上看是相同的,但是有些步骤实现可能不同。这时候,我们通常就应该要考虑用模板方法类了。也就是说,当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。我们通过模板方法模式把这些行为搬移到单一的地方,这样帮助子类摆脱重复的不变行为的纠缠。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
2020-07-07 Qt 编译时报错“退出,退出代码2”的原因