当前位置:   article > 正文

C++设计模式-模板方法模式

模板方法模式

目录

 

 

基本概念

例子和实例


 

基本概念

模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

结构图如下(此图来自大话设计模式):

模板方法模式是通过把不变行为搬移到超类中,去除子类中的重复代码来提现他的优势。

模板方法模式提供了一个很好的代码复用。

当不变和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复不变行为的纠缠。

 

例子和实例

程序运行截图如下:

源码如下:

Head.h

  1. #ifndef HEAD_H
  2. #define HEAD_H
  3. class Fundamental{
  4. public:
  5. virtual void primitiveOperation1();
  6. virtual void primitiveOperation2();
  7. void templateMethod();
  8. virtual ~Fundamental();
  9. };
  10. class ConcreteClassA: public Fundamental{
  11. public:
  12. void primitiveOperation1();
  13. void primitiveOperation2();
  14. virtual ~ConcreteClassA();
  15. };
  16. class ConcreteClassB: public Fundamental{
  17. public:
  18. void primitiveOperation1();
  19. void primitiveOperation2();
  20. virtual ~ConcreteClassB();
  21. };
  22. #endif //HEAD_H

Head.cpp

  1. #include "Head.h"
  2. #include <iostream>
  3. #include <string>
  4. using namespace std;
  5. void Fundamental::primitiveOperation1()
  6. {
  7. cout << "Fundamental::primitiveOperation1()" << endl;
  8. }
  9. void Fundamental::primitiveOperation2()
  10. {
  11. cout << "Fundamental::primitiveOperation1()" << endl;
  12. }
  13. void Fundamental::templateMethod()
  14. {
  15. this->primitiveOperation1();
  16. this->primitiveOperation2();
  17. }
  18. Fundamental::~Fundamental()
  19. {
  20. cout << "Fundamental::~Fundamental()" << endl;
  21. }
  22. void ConcreteClassA::primitiveOperation1()
  23. {
  24. cout << "ConcreteClassA::primitiveOperation1()" << endl;
  25. }
  26. void ConcreteClassA::primitiveOperation2()
  27. {
  28. cout << "ConcreteClassA::primitiveOperation1()" << endl;
  29. }
  30. ConcreteClassA::~ConcreteClassA()
  31. {
  32. cout << "ConcreteClassA::~ConcreteClassA()" << endl;
  33. }
  34. void ConcreteClassB::primitiveOperation1()
  35. {
  36. cout << "ConcreteClassB::primitiveOperation1()" << endl;
  37. }
  38. void ConcreteClassB::primitiveOperation2()
  39. {
  40. cout << "ConcreteClassB::primitiveOperation2()" << endl;
  41. }
  42. ConcreteClassB::~ConcreteClassB()
  43. {
  44. cout << "ConcreteClassB::~ConcreteClassB()" << endl;
  45. }

main.cpp

  1. #include "Head.h"
  2. #include <iostream>
  3. #include <string>
  4. using namespace std;
  5. int main(int *argc, int *argv[]){
  6. Fundamental *fundamental = new ConcreteClassA;
  7. fundamental->templateMethod();
  8. delete fundamental;
  9. cout << "-------------- 华丽的分割线 --------------" << endl;
  10. Fundamental *concrete = new ConcreteClassB;
  11. concrete->templateMethod();
  12. delete concrete;
  13. getchar();
  14. return 0;
  15. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/425151
推荐阅读
相关标签
  

闽ICP备14008679号