模板模式
什么是模板方法模式
模板方法模式是定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
原理图
为什么要用模板方法模式
现在有一个xls文件里的数据需要处理,经过处理后需要输出到一个txt文件中。
实现方式非常简单:
写一个处理类:
public class Processor {
public void inputData(){
System.out.println("从xls文件中读入数据");
}
public void process(){
System.out.println("处理xls文件的数据");
}
public void outputData(){
System.out.println("输出数据");
}
}
进行数据处理:
public class Main {
public static void main(String[] args) {
Processor processor = new Processor();
processor.inputData();
processor.process();
processor.outputData();
}
}
运行结果:
从xls文件中读入数据
处理xls文件的数据
输出数据
现在问题又来了,我要处理的数据在一个doc文件中。
那么仿照刚才的processor写一个处理doc文件的类好了……(这会出现重复代码)
那要是还有别的文件呢,还是仿照着写吗?很显然,还是仿照着写的话重复的代码会很多,这就需要抽象出一个父类。
同时,我们还可以想到,在调用的时候,永远是按照inputData()\、process()、outputData()的顺序调用的,为了方便调用,是不是可以把这几步变成一步。那么把这个顺序做成一个模板,便是使用了模板方法模式。
Processor抽象类:
public abstract class AbstractProcessor {
public final void processTemplate(String inputPath, String outputPath) {//防止子类重写,使用final
inputData(inputPath);
process();
outputData(outputPath);
}
public abstract void inputData(String path);
public abstract void process();
public void outputData(String outputPath) {
System.out.println("输出数据到" + outputPath);
}
}
具体Processor:
public class DocProcessor extends AbstractProcessor {
@Override
public void inputData(String path) {
System.out.println("从" + path + "文件中读入数据");
}
@Override
public void process() {
System.out.println("处理doc文件的数据");
}
}
public class XlsProcessor extends AbstractProcessor {
@Override
public void inputData(String path) {
System.out.println("从" + path + "文件中读入数据");
}
@Override
public void process() {
System.out.println("处理xls文件的数据");
}
}
进行数据处理:
public class Main {
public static void main(String[] args) {
AbstractProcessor xls = new XlsProcessor();
AbstractProcessor doc = new DocProcessor();
xls.processTemplate("data.xls", "target.txt");
System.out.println("===============");
doc.processTemplate("data.doc", "target.txt");
}
}
运行结果:
从data.xls文件中读入数据
处理xls文件的数据
输出数据到target.txt
===============
从data.doc文件中读入数据
处理doc文件的数据
输出数据到target.txt
现在,我们实现了两种文件格式的数据的处理,如果我们还需要处理其他形式的数据,仅需要继承AbstractProcessor类,并实现其中的inputData和process两个方法即可完成数据处理的功能。
这样,通过使用模板方法模式,把重复的代码放到父类中,让需要变换的代码在子类中实现,提供了一个很好的代码复用平台。