设计模式之模板方法模式
模板方法模式,定义一个操作中的算法的股价,而将一些步骤延迟到了子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。说白了就是有一个算法有很多部分,这个算法在基类中已经定义好了。而算法中的各个部分都写成各个成员函数了。然后在子类中可以覆盖这些成员函数,从而实现不同的算法。
其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 }
测试结果如下图:
模板方法模式就是提供了一个很好的代码复用平台。因为有时候,我们会遇到由一系列步骤构成的过程需要执行。这个过程从高层次上看是相同的,但是有些步骤实现可能不同。这时候,我们通常就应该要考虑用模板方法类了。也就是说,当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。我们通过模板方法模式把这些行为搬移到单一的地方,这样帮助子类摆脱重复的不变行为的纠缠。