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开头,并且是空实现的,在模板方法中可以调用这个方法如果具体类需要就进行重写,不需要的话由于他是空实现,对别的子类也没有影响。
Head First 设计模式系列之一----模板模式(java版)的更多相关文章
- Java设计模式系列-抽象工厂模式
原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755412.html 一.概述 抽象工厂模式是对工厂方法模式的再升级,但是二者面对的场景稍显差别. ...
- Java设计模式系列-工厂方法模式
原创文章,转载请标注出处:<Java设计模式系列-工厂方法模式> 一.概述 工厂,就是生产产品的地方. 在Java设计模式中使用工厂的概念,那就是生成对象的地方了. 本来直接就能创建的对象 ...
- Java设计模式系列-装饰器模式
原创文章,转载请标注出处:<Java设计模式系列-装饰器模式> 一.概述 装饰器模式作用是针对目标方法进行增强,提供新的功能或者额外的功能. 不同于适配器模式和桥接模式,装饰器模式涉及的是 ...
- Java设计模式之《模板模式》及使用场景
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9558825.html 模板模式,顾名思义,就是通过模板拓印的方式. 定义模板,就是定义框 ...
- 《JAVA设计模式》之模板模式(Template)
在阎宏博士的<JAVA与模式>一书中开头是这样描述模板方法(Template Method)模式的: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式 ...
- [js高手之路]设计模式系列课程-组合模式+寄生组合继承实战新闻列表
所谓组合模式,就是把一堆结构分解出来,组成在一起,现实中很多这样的例子,如: 1.肯德基套餐就是一种组合模式, 比如鸡腿堡套餐,一般是是由一个鸡腿堡,一包薯条,一杯可乐等组成的 2.组装的台式机同理, ...
- 设计模式系列之迭代器模式(Iterator Pattern)——遍历聚合对象中的元素
模式概述 模式定义 模式结构图 模式伪代码 模式改进 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修 ...
- 设计模式系列之建造者模式(Builder Pattern)——复杂对象的组装与创建
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 设计模式系列之工厂模式三兄弟(Factory Pattern)
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
随机推荐
- Judge
1. 循环list中的所有元素然后删除重复 public static List removeDuplicate(List list) { for ( int i = 0 ; i ...
- U盘安装SLES的方法
安装准备: 一个4G 或 大于4G的U盘 也同样适合移动硬盘, SLES-11-DVD-i586-GM-DVD1.iso 文件1) 将U盘格式化成FAT32格式; 2) 下载 syslinux工具 h ...
- cocos2d-x UserDefault
转自:http://blog.csdn.net/yanghuiliu/article/details/6912612 正在做项目中有很多游戏数据要保存,常见的玩家数据这些比较简单的可以用CCUserD ...
- 辛星浅谈PHP的混乱的编码风格
我们都知道.各种编程语言都有自己的风格,即使是像C和C++那样一脉相承的语言(C++本意全然兼容C的语法).编程风格上还是有些区别.比方非常典型的就是C++风格的单行凝视和C风格的多行凝视. 而尽管J ...
- html5非常火,他究竟与html4有何差别?
HTML5是HTML标准的下一个版本号.越来越多的程序猿開始HTML5来构建站点.假设你同一时候使用HTML4和HTML5的话 ,你会发现用HTML5从头构建.比从HTML4迁移到HTML5要方便非常 ...
- [置顶] 用Wireshark保存RTP的负载码流
这段时间工作太忙,有些日子没写文章了,今天准备了一篇Wireshark工具的一个小功能,在验证码流的时候非常好用,闲话不说,直接说步骤: 1.打开Wireshark抓取流媒体码流,然后用RTP过滤: ...
- 关于cocos2dx手游lua文件加密的解决方式
非常多使用cocos2dx+lua做游戏的同学.都会想到一个问题,我的游戏一旦公布,如何才干保证的我脚本代码不被破解.不泄露代码.尽管这和开源.共享的原则不合.可是代码也是coder的劳动成果,理应得 ...
- [Node.js] Using npm link to use node modules that are "in progress"
It is some times convenient, even necessary, to make use of a module that you are working on before ...
- careercup-中等难度 17.7
17.7 给定一个整数,打印该整数的英文描述(例如“One Thousand,Two Hundred Thirty Four”). 解法: 举个例子,在转换19 323 984时,我们可以考虑分段处理 ...
- Android drawable里面的图片存在,但是getIdentifier或者findViewByid找不到时处理步骤
drawable里面的图片存在,但是getIdentifier或者findViewByid找不到时执行一下project -> clean