登陆注册
8183300000157

第157章 9 模板方法模式与勾子方法(hookMethod)

大B:“刚才说模板方法模式运用于一个业务对象。事实上,框架频繁使用模板方法模式,使得框架实现对关键逻辑的集中控制。”

大B:“我们需要为基本Spring的应用做一个测试用例的基类。用于对类的方法进行单元测试。我们知道Spring应用把需要用到的对象都定义在外部的xml文件中,也称为context。”

大B:“通常我们会把context分割成多个小的文件,以便于管理。在测试时我们需要读取context文件,但是并不是每次都读取所有的文件。读取这些文件是很费时间的。所以我们想把它缓存起来,只要这个文件被读取过一次,我们就把它们缓存起来。所以我们通过扩展Junit的TestCase类来完成一个测试基类。我们需要实现缓存的逻辑,其它开发人员只需要实现读取配置文件的方法即可。它不用管是否具有缓存。”

代码:

public AbstractCacheContextTests extends TestCase{

private static Map contextMap=new HashMap();

protected ConfigurableApplicationContext applicationContext;

protected boolean hasCachedContext(Object contextKey){

return contextKeyToContextMap。containsKey(contextKey);

}

protected ConfigurableApplicationContext getContext(Object key){

String keyString=contextKeyString(key);

ConfigurableApplicationContext ctx=(ConfigurableApplicationContext)contextKeyToContextMap。get(keyString);

if(ctx……null){

if(key instanceof String[]){

ctx=loadContextLocations((String[])key);

}

contextKeyToContextMap。put(keyString,ctx);

}

return ctx;

}

protected String contextKeyString(Object contextKey){

if(contextKey instanceof String[]){

return StringUtils。arrayToCommaDelimitedString((String[])contextKey);

}

else{

return contextKey。toString();

}

}

protected ConfigurableApplicationContext loadContextLocations(String[]locations){

return new ClassPathXmlApplicationContext(locations);

}

//覆写TestCase的setUp方法,在运行测试方法之前从缓存中读取context文件,如果缓存中不存在则初始化applicationContext,并放入缓存。

protected final void setUp()throws Exception{

String[]contextFiles=getConfigLocations();

applicationContext=getContext(contextFiles);

}

//读取context文件,由子类实现

protected abstract String[]getConfigLocations();

}

大B:“rendercode();这样子类只需要去实现getConfigLocations方法,提供需要读取的配置文件字符数组就可以了。至于怎么去读取context文件内容,怎么实现缓存,则无需关心。AbstractCacheContextTests保证在运行所有测试之前去执行读取context文件的动作。注意这里setUp方法被声明为protected,是因为setUp方法是TestCase类的方法。在这里setUp方法被定义为final了,是确保子类不能去覆写这个方法,从而保证了父类控制的逻辑。”

小A:“如果使用过Junit会发生什么问题?”

大B:“TestCase的setUp方法,就是在这个测试类的测试方法运行之前作一些初始化动作。如创建一些所有测试方法都要用到的公共对象等。在这里把setUp方法声明为final之后,子类再也无法去扩展它了,子类同时还需要一些额外的初始化动作就无法实现了。可能你会说:‘把setUp方法的final修饰符去掉就可以了啊’。这样是可以的,但是去掉final修饰符后,子类是可以覆写setUp方法,而去执行一些额外的初始化。而可怕的是,父类从此失去了必须读取context文件及缓存context内容的逻辑。为了解决这个问题,可以实现一个空方法onSetUp。在setUp方法中调用onSetUp方法。这样子类就可以通过覆写onSetUp方法来进行额外的初始化。”

//覆写TestCase的setUp方法,在运行测试方法之前从缓存中读取context文件,如果缓存中不存在则初始化applicationContext,并放入缓存。

代码:

protected

n class=“keyword”>final void setUp()throws Exception{

String[]contextFiles=getConfigLocations();

applicationContext=getContext(contextFiles);

onSetUp();

}

protected void onSetUp(){

}

//读取context文件,由子类实现

protected abstract String[]getConfigLocations();

}

rendercode();

小A:“为什么不把onSetUp声明为abstract呢?”

大B:“这是因为子类不一定总是需要覆写onSetUp方法。可以说onSetUp方法是为了对setUp方法的扩展。像onSetUp这样的空方法就称之为勾子方法(HookMethod)。”

同类推荐
  • 办公软件高级应用

    办公软件高级应用

    日新月异的信息技术使计算机的应用渗透到各行各业,融入到我们的工作、学习和生活中,特别是在办公领域中运用计算机技术,可以实现办公自动化,成倍地提高工作效率。在众多的办公软件中,微软公司的Office系列软件是办公自动化软件中的佼佼者,其强大的功能深受全世界广大用户的青睐。根据当前业界的需求以及办公软件的实际应用范围,本书针对Office2003系列产品,深入讲解其高级应用知识和操作技能。
  • 不懂PowerPoint就当不好经理

    不懂PowerPoint就当不好经理

    经理人如何用PowerPoint,来规划部门的发展,如何用PowerPoint来表达自己的经营主张?本书为各类经理人提供了从入门到提高,从原理到实战的一系列知识,相信本书将让演示文稿为经理人的管理效能加分!
  • 中文版AutoCAD2011基础与应用案例教程

    中文版AutoCAD2011基础与应用案例教程

    本书采用项目教学方式,通过大量案例全面介绍了AutoCAD2011软件的功能和应用技巧。全书共分8个项目,内容涵盖AutoCAD2011基本操作,绘制与编辑图形,标注尺寸,添加文字注释与应用表格,创建与应用块,绘制与编辑三维图形,图形输出等。
  • 《Internet实用技术》作业集

    《Internet实用技术》作业集

    随着计算机应用的普及和社会信息化水平的提高,Internet已走进我们的生活。《Internet实用技术》这门课将带领我们走进网络的神秘殿堂,让我们认识网络,了解网络,进而学会使用网络,维护网络。其范围涵盖了在授课过程中所讲授的内容,题型多样,内容丰富,并附有两套模拟题,最后附有答案。学生可按照课程进度做习题来巩固和掌握知识。本作业集由李琳编写,由西北工业大学网络教育学院负责组稿和审定。因为时间仓促,水平有限,错误和不当之处在所难免,敬请读者批评指正。
热门推荐
  • 拾光任性

    拾光任性

    他们相遇在高中,任性让他们在一起,她的敏感和他的热心是碰撞还是融合,在时光的道路上他们是渐行渐远还是携手相伴,最青涩的感情遇到最难的阻碍,她选择了放手,他却选择原地守候。那一年,他追上了她的步伐是否还能回到当年的温暖与纯真......“位彦,我们之间缺的不仅是一年空缺......有些时候感情不能只靠你追我赶。”“情诗,有些遗憾只能让自己坚定不移相信最初,而我的最初是你。”........敬请期待
  • 一棵白菜的意外遭遇

    一棵白菜的意外遭遇

    本书是一本短小精悍的短篇故事集。作者非情节式小说的写作,是一种推陈出新的文体艺术模式,作品写得云淡风轻,看似不经意,实则很有味。作品选取一些生活中常见的事例,写尽了人生百态,人情冷暖。
  • 提高社交礼仪能力(学生综合素质提高手册)

    提高社交礼仪能力(学生综合素质提高手册)

    社交礼仪是指人们在人际交往过程中所具备的基本素质,交际能力。通过社交,人们可以沟通心灵,建立深厚友谊,取得支持与帮助;通过社交,人们可以互通信息,共享资源,对取得事业成功大有获益。并且社交礼仪有助于提高人们的自身修养。本书讲述了很多在社交礼仪上需要注意的方面,内容详尽,通俗易懂。
  • 天行

    天行

    号称“北辰骑神”的天才玩家以自创的“牧马冲锋流”战术击败了国服第一弓手北冥雪,被誉为天纵战榜第一骑士的他,却受到小人排挤,最终离开了效力已久的银狐俱乐部。是沉沦,还是再次崛起?恰逢其时,月恒集团第四款游戏“天行”正式上线,虚拟世界再起风云!
  • 棋王稳士

    棋王稳士

    根据真实人物经历改编。有着优秀遗传基因的天选之人,经历了乱世超高智能者,一生坎坷,几经沉浮,终于出人头地,却又放弃一切荣誉,隐姓埋名,甘做普通人。他都经历了什么?
  • 灰公主的爱情

    灰公主的爱情

    “不要走过来……”我害怕地退后,推到一棵树下,看着李安娜被树荫遮住的脸,还有笑容,我的心在不断地害怕……李安娜靠近我,用她尖尖的指甲轻轻在我脸上划过,我的眼睛不断地看着她的指甲,害怕她会画花我的脸。“怎么?害怕了?”李安娜用指甲在我的脸轻轻地一划,我感觉到自己的脸在流血,我恐惧地看着她,心里快承受不下了。“你看!轻轻地一划,你的脸就破了!这还真粉嫩。”李安娜轻轻地又一划,脸上有多了一条伤,恐惧的眼神看着李安娜,“不要划了!”
  • 庄周梦蝶:虐心之恋

    庄周梦蝶:虐心之恋

    主要是以残缺的爱情,没有圆满,纯属找虐的一部合并多篇小说文章。不不不,没有全虐,看惯了“悲惨世界”我们还得综合一点儿甜。有同学们爱看的古言,总裁,校园……等合集,你确定不点进来看看,支持一下作者???
  • 刺卿记之神魔之殇

    刺卿记之神魔之殇

    刺卿,是刺客的一种,他们不像一般刺客那样,逐利追名,他们是刺客界的高尚之人,更偏爱于忠义,恩仇。为之付诸生命者,数不胜数。他们通常行事都有着计谋和规划,这是和普通刺客的最大不同。亦是受人称道之处。
  • 豪情踏苍穹

    豪情踏苍穹

    因玩游戏机缘巧合下来到了异界大陆:空间里文字的神秘提示,跟想象中不太一样的穿越地点,一段又一段不可思议的经历,一幕又一幕游戏里曾见过的画面。自己的目标是什么,自己的敌人是谁?不知道。带着种种疑惑,主角申晨踏上了一段不深沉的征程!!!
  • 水浒外传之大梁帝国

    水浒外传之大梁帝国

    主角宋江,一表人才,风流倜傥,玉树临风,才华横溢……“宋江真的是这样的吗?”自幼熟读四书五经,三十六计。三岁学文,大学,中庸,春秋,孟子手到擒来,孙子兵法出口成章;七岁习武,南拳,北腿,挥刀,舞剑运用自如,小李飞刀百发百中。八岁能通经史,九岁能知古今。上知天文地理,下知鸡毛蒜皮。前三百年,后三百年无人能及。“这是宋江吗?混蛋!”最终带领梁山军团一统天下,建立大梁帝国。牧阳春上新浪博客:http://www.*****.com/?u/5342743183