Head First 设计模式系列之一----模板模式(java版)
开篇序言:四人帮的设计模式对于我这个菜鸟看着打瞌睡,后面果断买了一本head first的,感觉还可以像看报纸似的,花了一个寒假的晚上看了大半,确实内容也挺吸引人的,讲的很风趣。否则我也不可能,大过年的小伙伴们还在外面耍,自己还在那里装B。可是看完的困惑也随之而来,我怎么才能熟练的操练这些模式呢!书上讲的头头是道,可是实际中我们确不知道怎么运用!后面看到别人牛逼的都是随便一个模式都能脱口面而出,还有就是实际项目接触多了,肯定也有一定的职业嗅觉!所以希望自己也能够通过写博客,让自己对设计模式有一个更深层次的认识,中间肯定会有很多不足甚至是错误的,欢迎大家指出,我们互相学习、交流!
申明:模板模式应该是用的比较多的一个模式。记得PM还在给我们讲业务时,我们的技术大牛直接来一句不就是”模板模式“嘛!当时我就想:呀,得回去复习下模板模式讲的是嘛东西了!于是就有了下面这篇文章
一、定义和类图
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
说明:抽象模板类的模板方法templateMethod分别调用abstractMethod1()、abstractMethod2().完成整个业务逻辑。而对于不同子类可以可以根据自己的的需求而重写这两个方法达到自己的要求。
二、实例(代码是有错的,这里只提供一个思想)
业务要求:对多个dat文件,分别作成csv文件,接着导入到数据库中。
抽象模板类UpdateMasterTableTask
package design.a.template; public abstract class UpdateMasterTableTask { //这是个模板方法 public void run(){ readMasterDataFileWriteToTempDataFile(); updateMasterTableTask(); backUpDirFile(); } //将dat文件写成临时目录下的cvs文件 protected abstract void readMasterDataFileWriteToTempDataFile(); //把csv文件更新到数据库中,先删除表中的数据,然后再更新到数据库中 private void updateMasterTableTask(){ deleteMasterTableData(); insertMasterTableData(); } //备份dat文件到指定位置中 private void backUpDirFile(){ /** * 此外省略几千字 */ } //删除表中的数据 private void deleteMasterTableData(){ /** * 此外省略几千字 */ } //把数据更新到数据库 private void insertMasterTableData(){ /** * 此外省略几千字 */ } }
具体模板类1UpdateStuMasterTableTask
package design.a.template; import java.io.BufferedReader; import java.io.IOException; public class UpdateStuMasterTableTask extends UpdateMasterTableTask{ @Override protected void readMasterDataFileWriteToTempDataFile() { BufferedReader bufferedReader = null; //得到一行数据 String line = bufferedReader.readLine(); //此时如果dat文件内空是以,为分隔符的话,对应处理为 String[] split = line.split(","); writeToTempCsvFile(csvWriter, split); } //写入到csv中去 private void writeToTempCsvFile(CsvWriter csvWriter, String split){ /** * 此外省略几千字 */ } }
具体模板类2UpdateTeacMasterTableTask
package design.a.template; import java.io.BufferedReader; public class UpdateTeacMasterTableTask extends UpdateMasterTableTask{ @Override protected void readMasterDataFileWriteToTempDataFile() { BufferedReader bufferedReader = null; //得到一行数据 String line = bufferedReader.readLine(); //此时如果dat文件内空是以-为分隔符的话,对应处理为 String[] split = line.split("-"); writeToTempCsvFile(csvWriter, split); } //写入到csv中去 private void writeToTempCsvFile(CsvWriter csvWriter, String split){ /** * 此外省略几千字 */ } }
补充一下:
对于抽像模板类还可以定义钩子方法,方法名一般以do开头,并且是空实现的,在模板方法中可以调用这个方法如果具体类需要就进行重写,不需要的话由于他是空实现,对别的子类也没有影响。