模板方法模式
1、定义
定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤
2、结构图
- AbstractSort是一个抽象类,将sort方法抽象,showSortResult实现。
- ConcreteSort是对AbstractSort的实现,并实现sort方法
3、代码
(1)AbstractSort类
public abstract class AbstractSort {
public abstract void sort(int[] nums);
public void showSortResult(int[] nums){
sort(nums);
for(int num: nums){
System.out.println(num);
}
}
}
(2)ConcreteSort类
public class ConcreteSort extends AbstractSort {
public void sort(int[] array) {
for (int i = 0; i < array.length - 1; i++) {
selectSort(array, i);
}
}
private void selectSort(int[] array, int index) {
int MinValue = 32767; // 最小值变量
int indexMin = 0; // 最小值索引变量
int Temp; // 暂存变量
for (int i = index; i < array.length; i++) {
if (array[i] < MinValue) { // 找到最小值
MinValue = array[i]; // 储存最小值
indexMin = i;
}
}
Temp = array[index]; // 交换两数值
array[index] = array[indexMin];
array[indexMin] = Temp;
}
}
(3)客户端
public class Client {
public static void main(String[] args) {
int[] nums = {0,9,5,3,44,2,5,6,89};
AbstractSort sort = new ConcreteSort();
sort.showSortResult(nums);
}
}
(4)运行结果
0
2
3
5
5
6
9
44
89
4、总结
容易扩展。一般来说,抽象类中的模版方法是不易反生改变的部分,而抽象方法是容易反生变化的部分,因此通过增加实现类一般可以很容易实现功能的扩展,符合开闭原则。
便于维护。对于模版方法模式来说,正是由于他们的主要逻辑相同,才使用了模版方法,假如不使用模版方法,任由这些相同的代码散乱的分布在不同的类中,维护起来是非常不方便的。
比较灵活。因为有钩子方法,因此,子类的实现也可以影响父类中主逻辑的运行。但是,在灵活的同时,由于子类影响到了父类,违反了里氏替换原则,也会给程序带来风险。这就对抽象类的设计有了更高的要求。