模板方法模式的定义:定义一个操作中的算法框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
模板方法的通用类图
我们所说的模板方法指的就是抽象类中的templete方法,该方法实现对doSomething方法的调用并且这个方法的具体实现是交由子类实现的。
模板方法的具体应用,比如我们开发的系统需要解析文件并导入数据库,文件类型有txt、csv、xls,我们就可以考虑模板方法模式。
/** * 文件解析的抽象类 * */ public abstract class AbstractFileParser { // 解析文件的模板方法 public final void fileParser(File file) { // 解析文件 parser(file); } // 具体解析文件的逻辑交由子类去实现 protected abstract void parser(File file); }
/** * Txt 文件解析 */ public class TxtFileParser extends AbstractFileParser { /** * Txt 文件解析 * @param file */ @Override protected void parser(File file) { System.out.println("解析txt文件"); } }
/** * Csv 文件解析 * */ public class CsvFileParser extends AbstractFileParser { /** * 解析CSV文件 * * @param file */ @Override protected void parser(File file) { System.out.println("开始解析CSV文件"); } }
/** * XLs文件解析 * */ public class XlsFileParser extends AbstractFileParser { /** * xls 文件解析 * * @param file */ @Override protected void parser(File file) { System.out.println("开始解析xls文件"); } }
具体的类已经完成,那么如何应用呢?我们可以根据用户上传的文件类型来调用不同的文件解析类
public class Client { public static void main(String[] args) throws IOException { File file=new File("aaa.txt"); if("txt".equalsIgnoreCase(file.getName().split("[.]")[1])){ AbstractFileParser parser=new TxtFileParser(); parser.fileParser(file); } if("csv".equalsIgnoreCase(file.getName().split("[.]")[1])){ AbstractFileParser parser=new CsvFileParser(); parser.fileParser(file); } if("xls".equalsIgnoreCase(file.getName().split("[.]")[1])){ AbstractFileParser parser=new XlsFileParser(); parser.fileParser(file); } } }
在《java与模式》一书中提到了另一个例子,一个存款计算利息的场景,假设系统需要支持两种存款账号即货币市场账号和定期存款账号,这两种账号的存款利息是不同的,但是我们应该可以重这个场景中抽象出一个方法,即利息的计算,只是利息计算分两种情况,那么就可以使用两个实现类来实现。
类图如下: