说明
模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤。
UML
角色
抽象类:定义算法框架,留出框架中的某些步骤交给子类实现。
实现类:实现父类中留出的具体步骤。
代码
以实现一个加减乘除的计数器为例,代码如下。
抽象类,定义算法框架为calculate方法,留出具体步骤为getResult方法。
/**
* @author ctl
* @date 2021/1/24
*/
public abstract class Counter {
public int calculate(int[] nums) {
return getResult(nums);
}
protected abstract int getResult(int[] nums);
}
实现类,加法,实现父类中留出的具体步骤,完成加法运算
/**
* @author ctl
* @date 2021/1/24
*/
public class Addition extends Counter {
@Override
protected int getResult(int[] nums) {
int r = 0;
for (int num : nums) {
r += num;
}
return r;
}
}
实现类,减法,实现父类中留出的具体步骤,完成减法运算
/**
* @author ctl
* @date 2021/1/24
*/
public class Subtraction extends Counter {
@Override
protected int getResult(int[] nums) {
int r = 0;
for (int i = 0; i < nums.length - 1; i++) {
r = nums[i] - nums[i + 1];
}
return r;
}
}
实现类,乘法,实现父类中留出的具体步骤,完成乘法运算
/**
* @author ctl
* @date 2021/1/24
*/
public class Multiplication extends Counter {
@Override
protected int getResult(int[] nums) {
int r = 0;
for (int i = 0; i < nums.length - 1; i++) {
r = nums[i] * nums[i + 1];
}
return r;
}
}
实现类,除法,实现父类中留出的具体步骤,完成除法运算
/**
* @author ctl
* @date 2021/1/24
*/
public class Division extends Counter {
@Override
protected int getResult(int[] nums) {
int r = 0;
for (int i = 0; i < nums.length - 1; i++) {
r = nums[i] / nums[i + 1];
}
return r;
}
}
测试类
/**
* @author ctl
* @date 2021/1/24
*/
public class TemplateMain {
public static void main(String[] args) {
Counter counter;
int[] nums = {8, 2};
int calculate;
System.out.println("开始计算" + Arrays.toString(nums));
// 加法
counter = new Addition();
calculate = counter.calculate(nums);
System.out.println("加法:" + calculate);
// 减法
counter = new Subtraction();
calculate = counter.calculate(nums);
System.out.println("减法:" + calculate);
// 乘法
counter = new Multiplication();
calculate = counter.calculate(nums);
System.out.println("乘法:" + calculate);
// 除法
counter = new Division();
calculate = counter.calculate(nums);
System.out.println("除法:" + calculate);
}
}
结果
可以看出完成了对8,2的加减乘除计算。
总结
模板方法模式中最重要的两个点,一个是抽象类定义算法框架并留出可扩展的步骤,另一个是实现类去实现这些具体步骤,来完成整个算法。
上述例子中Counter抽象类中的calculate方法,就是定义了算法框架,只不过这个例子比较简洁,整个算法步骤就是留出的待实现的getResult方法。