



下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java设计模式之模板方法模式一、引子
这是一个很简单的模式,却被非常广泛的使用。之所以简单是因为在这个模式中仅仅使用到了继承关系。
继承关系由于自身的缺陷,被专家们扣上了"罪恶"的帽子。"使用委派关系代替继承关系","尽量使用接口实现而不是抽象类继承"等等专家警告,让我们这些菜鸟对继承"另眼相看"。
其实,继承还是有很多自身的优点所在。只是被大家滥用的似乎缺点更加明显了。合理的利用继承关系,还是能对你的系统设计起到很好的作用的。而模板方法模式就是其中的一个使用范例。
二、定义与结构
GOF给模板方法(TemplateMethod)模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。这里的算法的结构,可以理解为你根据需求设计出来的业务流程。特定的步骤就是指那些可能在内容上存在变数的环节。
可以看出来,模板方法模式也是为了巧妙解决变化对系统带来的影响而设计的。使用模板方法使系统扩展性增强,最小化了变化对系统的影响。这一点,在下面的举例中可以很明显的看出来。
来看下这个简单模式的结构吧:
1)AbstractClass(抽象类):定义了一到多个的抽象方法,以供具体的子类来实现它们;而且还要实现一个模板方法,来定义一个算法的骨架。该模板方法不仅调用前面的抽象方法,也可以调用其他的操作,只要能完成自身的使命。
2)ConcreteClass(具体类):实现父类中的抽象方法以完成算法中与特定子类相关的步骤。
下面是模板方法模式的结构图。
三、举例
还是在我刚刚分析完源码的'JUnit中找个例子吧。JUnit中的TestCase以及它的子类就是一个模板方法模式的例子。在TestCase这个抽象类中将整个测试的流程设置好了,比如先执行Setup方法初始化测试前提,在运行测试方法,然后再TearDown来取消测试设置。但是你将在Setup、TearDown里面作些什么呢?因此,而这些步骤的具体实现都延迟到子类中去,也就是你实现的测试类中。
来看下相关的源代码吧。
这是TestCase中,执行测试的模板方法。你可以看到,里面正像前面定义中所说的那样,它制定了"算法"的框架--先执行setUp方法来做下初始化,然后执行测试方法,最后执行tearDown释放你得到的资源。
publicvoidrunBarethrowsThrowable{
setUp;
try{
runTest;
}
finally{
tearDown;
}
}
这就是上面使用的两个方法。与定义中不同的是,这两个方法并没有被实现为抽象方法,而是两个空的无为方法(被称为钩子方法)。这是因为在测试中,我们并不是必须要让测试程序使用这两个方法来初始化和释放资源的。如果是抽象方法,则子类们必须给它一个实现,不管用到用不到。这显然是不合理的。使用钩子方法,则你在需要的时候,可以在子类中重写这些方法。
protectedvoidsetUpthrowsException{}
protectedvoidtearDownthrowsException{}
四、适用情况
根据上面对定义的分析,以及例子的说明,可以看出模板方法适用于以下情况:
1)一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
2)各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。其实这可以说是一种好的编码习惯了。
3)控制子类扩展。模板方法只在特定点调用操作,这样就只允许在这些点进行扩展。比如上面runBare方法就只在runTest前面适用setUp方法。如果你不愿子类来修改你的模板方法定义的框架,你可以采用两种方式来做:一是在API中不体现出你的模板方法;二、将你的模板方法置为final就可以了。
可以看出,使用模板方
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 全新农药知识培训课件
- 民航维修计划培训课件
- 福建中学中考题数学试卷
- 二年级期考试卷数学试卷
- 浮阳中学6年级数学试卷
- 醉翁亭记注音解释版
- 2025年04月南平延平峡阳镇卫生院招聘驾驶员笔试历年专业考点(难、易错点)附带答案详解
- 2025年湖南郴州市第三人民医院招聘急需紧缺岗位人员10人笔试历年专业考点(难、易错点)附带答案详解
- 2024年12月公考时政常识积累(06日)笔试历年参考题库附带答案详解
- 2025至2030代驾产业市场深度调研及发展趋势与发展趋势分析与未来投资战略咨询研究报告
- 2024年萍乡市县区事业单位引进人才笔试真题
- 2025-2030中国透明无色聚酰亚胺薄膜行业发展动态及应用趋势预测报告
- 2025中国白酒酒业市场中期研究报告
- 2025重庆新华出版集团招聘18人笔试参考题库附带答案详解
- 离婚协议书正规打印电子版(2025年版)
- (外研版3起)英语五年级上册单词字帖书写练习(手写体)高清打印版
- 石家庄市国企招聘考试真题题库2024版
- 路面修复施工方案及路面石材下沉修复施工方案
- 部编八下语文游记阅读训练题语文八年级下册能力训练(部编版)
- 一例急性心肌梗死合并糖尿病酮症酸中毒患者的个案护理
- 生物安全自查表
评论
0/150
提交评论