一杯清酒邀明月
天下本无事,庸人扰之而烦耳。
posts - 3121,comments - 209,views - 578万

设计模式之模板方法模式
  模板方法模式,定义一个操作中的算法的股价,而将一些步骤延迟到了子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。说白了就是有一个算法有很多部分,这个算法在基类中已经定义好了。而算法中的各个部分都写成各个成员函数了。然后在子类中可以覆盖这些成员函数,从而实现不同的算法。

其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 }
复制代码

测试结果如下图:

  模板方法模式就是提供了一个很好的代码复用平台。因为有时候,我们会遇到由一系列步骤构成的过程需要执行。这个过程从高层次上看是相同的,但是有些步骤实现可能不同。这时候,我们通常就应该要考虑用模板方法类了。也就是说,当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。我们通过模板方法模式把这些行为搬移到单一的地方,这样帮助子类摆脱重复的不变行为的纠缠。

posted on   一杯清酒邀明月  阅读(53)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
历史上的今天:
2020-07-07 Qt 编译时报错“退出,退出代码2”的原因
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

点击右上角即可分享
微信分享提示