设计模式_15 模板方法模式
15 模板方法模式
15.1 概念
定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以在不改变算法结构的情况下重定义该算法某些特定实现步骤。
15.2 结构
抽象类:负责给出一个算法的轮廓和骨架。由一个模板和若干个方法组成。
–模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法。
–基本方法:实现算法各个步骤的方法,是模板方法的组成部分。
–—抽象方法:抽象方法由抽象类声明,由其具体子类实现。
–—具体方法:具体方法由抽象类或具体类声明并实现,其子类可以进行覆盖也可以直接继承。
–—钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。
具体子类:实现抽象类中定义的抽象方法和钩子方法。
15.3 实现
15.3.1 UML图
15.3.2 代码
#include<iostream>
#include<string>
using namespace std;
class ShortestPath {
public:
void solutionProcess() {
getEdges();
solutionAlgorithm();
printPath();
}
void getEdges() {
cout << "输入边数据" << endl;
}
virtual void solutionAlgorithm() = 0;
void printPath() {
cout << "打印最短路" << endl;
}
};
class Dijkatra : public ShortestPath {
public:
void solutionAlgorithm() {
cout << "Dijkatra求最短路" << endl;
}
};
class SPFA : public ShortestPath {
public:
void solutionAlgorithm() {
cout << "SPFA求最短路" << endl;
}
};
class Floyd : public ShortestPath {
public:
void solutionAlgorithm() {
cout << "Floyd求最短路" << endl;
}
};
class AStar : public ShortestPath {
public:
void solutionAlgorithm() {
cout << "A*求最短路" << endl;
}
};
int main() {
ShortestPath* solution = new Dijkatra();
solution->solutionProcess();
return 0;
}
15.4 优缺点
15.4.1 优点
提高代码复用性
实现反向控制,且符合开闭原则。
15.4.2 缺点
对每个不同实现都需要定义一个子类,导致类的个数增加,系统更加庞大,设计也更加抽象。
子类的执行结果会影响父类的结果,提高代码阅读难度。
15.5 使用场景
算法整体步骤很固定但是其中个别部分易变时。
需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制。