设计模式_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 使用场景
算法整体步骤很固定但是其中个别部分易变时。
需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制。
模板方法模式是一种设计模式,它定义了算法的骨架并在抽象类中实现,将具体步骤留给子类来完成。通过这种方式,子类可以在不改变算法结构的情况下重定义特定步骤。该模式在代码中表现为抽象类定义模板方法和基本方法,其中抽象方法由子类实现,钩子方法由抽象类提供并可能被子类覆盖。示例代码展示了如何使用模板方法模式实现不同最短路径算法(如Dijkstra、SPFA、Floyd和A*)。模板方法模式的优点在于提高代码复用性和实现反向控制,但可能导致类数量增多,增加阅读难度。适用场景包括算法步骤固定但部分可变,以及需要子类控制父类算法执行的部分。
133

被折叠的 条评论
为什么被折叠?



