WHCSRL 技术网

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

模板方法模式由两部分结构组成:抽象父类和具体的实现子类。通常在抽象父类中封装了子类的算法框架,也包括实现一些公共方法以及封装子类中所有方法的执行顺序。子类通过继承这个抽象类,也继承了整个算法结构,并且可以选择重写父类的方法。
在这里插入图片描述

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

当多个类有相同的方法,并且逻辑相同,只是细节上有差异时,可以考虑使用模板模式。具体的实现上可以将相同的核心算法设计为模板方法,具体的实现细节由子类实现。

缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

以电脑生产为例,电脑生产的过程都是一样的,只是一些装配的器件可能不同而已。

/*
关键代码:在抽象类实现通用接口,细节变化在子类实现。
*/

#include<iostream>

using namespace std;

class Computer {
  public:
  	void product() {
      installCpu();
      installRam();
      installGraphicsCard();
    }
  
  protected:
  	virtual void installCpu() = 0;
  	virtual void installRam() = 0;
  	virtual void installGraphicsCard() = 0;
};

class ComputerA : public Computer {
  protected:
  	void installCpu() override {
      cout << "ComputerA install Inter Core i7" << endl;
    }
  
  	void installRam() override {
      cout << "ComputerA install 2G Ram" << endl;
    }
  
  	void installGraphicsCard() override {
       cout << "Computer install GTX960 GraphicsCard" << endl;
    }
}

class ComputerB : public Computer {
  protected:
  	void installCpu() override {
      cout << "ComputerB install Inter Core i9" << endl;
    }
  
  	void installGraphicsCard() override {
       cout << "ComputerB install GTX1080 GraphicsCard" << endl;
    }
};

int main() {
  ComputerB *c1 = new ComputerB();
  c1->product();
  
  delete c1;
  c1 = nullptr;
  
  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
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
推荐阅读