登陆注册
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)。”

同类推荐
  • 一本书读懂24种互联网思维

    一本书读懂24种互联网思维

    本书整合的改变世界的24种互联网思维,让我们对互联网新思维的认识变得立体、系统起来;同时深入浅出、通俗易懂地从技术和实践分析互联网新思维与传统思维相比较的优势,医治互联网焦虑症。未来属于既能深刻理解传统商业的本质,同时又具备互联网思维的人。
  • 中文版AutoCAD2005辅助设计宝典

    中文版AutoCAD2005辅助设计宝典

    本书全面、详细地介绍了中文版AutoCAD2005的特点、功能以及使用方法和技巧。全书共分11章,前九章分别介绍了利用中文版AutoCAD2005进行辅助设计的方法和技巧,最后两章讲解了若干综合实例。
  • 图说电子计算机

    图说电子计算机

    今天人们谈到计算机常常会把它和网络联系起来。20世纪90年代兴起的因特网其影响之广、普及之快也是大家始料未及的,也从没有一种技术能像网络一样日新月异,并迅速地改变着我们的学习和生活方式。因特网大大缩小了时空界限,为我们提供了快捷方便的交流途径。在未来10年内,计算机又将会有怎样飞速的发展呢?在互联网上进行医疗诊断、远程教学、电子商务、视频会议等活动已经实现,未来的互联网的传输速率将会提高100倍,大家可以随时随地连接到因特网上,更方便地进行交流、沟通和开展商务活动。
  • Delphi程序设计教程

    Delphi程序设计教程

    本书为适应不同层次读者的需要,从Delphi的基本知识讲起,由浅入深,全面讲述了Delphi的集成开发环境、Delphi的编程语言——ObjectPascal、常用组件的使用、窗体的设计、菜单的设计、对话框的设计、多文档界面程序的设计、多媒体编程和数据库应用程序设计等内容。
  • 信息技术教育大全-操作系统大全

    信息技术教育大全-操作系统大全

    本书系统介绍说明了有关电子信息系统及操作系统等知识,希望对该信息技术有需求的读者能够从中得到帮助。
热门推荐
  • 重生之另类人生

    重生之另类人生

    鬼王,来自未来的恶魔医生,第一个拥有超级智慧从而可与神媲美的凡人。苏阳,来自现代的普通菜鸟医学生,顶级颓男,处处受人欺负。两个身份反差悬殊的人在错误的时间,错误的地点阴差阳错地被困在同一个身体内。究竟谁的意识可以主动掌控这个身体,是拥有终极智慧的鬼王,还是身体的原主人苏阳?从乡村卫生室的实习医生一步步走来,苏阳不仅需要寻找终极智慧的进化之路,还要探求摆脱并解决鬼王的方法。自己倾慕已久的团支书陈洁;阳光率真、青春绝艳的富家女小护士方雯茜;还有蛮横泼辣但外强中干、拥万千宠爱于一身却内心脆弱的副市长之女佘曼妮……在这漫长的进化之路上,苏阳又会跟这几位性格迥异的美女演绎出何种浪漫曲折的故事呢。起点二组签约作品,枪炮小猪力作,绝对不会令大家失望。
  • 本源修补师

    本源修补师

    九星大陆上的人,出生就带有一颗灵种。随着修炼,灵种生根发芽成长,可以成为星灵士。但主角星野,一个石头缝里蹦出来的野人,他却没有灵种。自小就与凶兽作伴长大,一次偶然搭救了一名老者。自此学会了说话,识字,做人。并且被赐予了一颗世间唯一的本源种。本应该一飞冲天的星野,真正投入修炼,才发现他太天真了。人家修炼吸收星灵之气,可以使灵种开枝散叶。而星野只能靠修修扑扑,帮助灵种生长。人家灵叶化剑,星野化把锤子。人家灵叶化盾,星野化铁砧。人家灵叶化火,水,星野也化火,水。但人家火可烧人,星野火只能烧石头,烧灵器。这就是天地间唯一的本源种吗,你应该威力无穷啊,那你化出这些东西是干啥,叫我当铁匠吗!在没有条件,创造条件的情况下,星野终于修补到强者,却渐渐发现了一个关乎整个大陆的秘密。而在破解迷局的过程中,自己的身世也逐渐浮出水面。
  • 随心舒写

    随心舒写

    短篇小说,有古言有现代,风格不定,任君选择
  • 重生激情年代

    重生激情年代

    1999年,是个大风起兮猪飞天的年代。重生在这个年代,对于叶成来说,成就一番事业只是初级追求。实现人生理想与价值也不过是中级追求。享受激情人生,才是终极追求!什么是激情人生?很简单:喝最好的酒!泡最美的妞!交最铁的朋友!
  • 山林大亨

    山林大亨

    挖蘑菇也能成万元户,捡个石头就能引起收藏界风起云涌。你说恐狼跟袋狼早已经灭绝?蓝马羚与渡渡鸟更是无处寻踪?呵呵,林子豪笑了。在这里,猴子会说话,狐狸爱唱歌,森林王蛇能打架。种果树,养蜜蜂,偶尔还能煲点灵芝补补身。看到谁谁谁挖了个千年太岁就上新闻,林子豪又笑了。他不会告诉别人,千年太岁在他这儿只能当肥料。更可笑的是,全世界都还在猜测慈禧夜明珠下落的时候,他却拿它当了夜明灯。这里是‘鬼山林’,一个奇妙的山林,呼叫更多小伙伴加入!让我们一起打倒帝国主义,中国万岁!额,不是,再来一遍。让我们打倒开发商,保护大自然!
  • 从型月开始的次元之旅

    从型月开始的次元之旅

    当一觉睡醒的苏灿发现自己已经穿越到二次元的世界的时候,内心是兴奋又有些窃喜的。而当在型月世界成为了魔神之后,苏灿才发现,这都是坑啊。简介纯属瞎编,内容绝对劲爆。本书书友群:644480567(穿越次元世界:第四次圣杯战争(已完成)--FGO(正在进行中……))(未完成世界:丧尸融合卷(学院默示录+学园孤岛),漆黑的子弹,伊莉雅世界(美游世界+伊莉雅世界),约会大作战,刀剑神域,火影,魔禁,出包王女。)
  • 花千骨之与你再续前世缘

    花千骨之与你再续前世缘

    花千骨同人小说,续写花千骨投胎之后与长留上仙白子画的虐恋故事
  • 燃烧吧漫威

    燃烧吧漫威

    新书《三尺夜游》已经发布!我要点燃希望之火为爱为理想为正义我即如传说中的盗火者普罗米修斯带来光明带来希望如此伟大的我现在只提一个小小的要求女士们先生们请把你们身上的好东西通通交出来吧钢铁盔甲振金盾牌喵喵锤这是谁加肥加大的裤衩………又名《抓住那个纵火犯》《我就看看不点火》
  • 重生之分身为虫

    重生之分身为虫

    醒来的很茫然,陆庭看着周围漆黑的四壁:“这是哪里?”“我怎么会在这?”记忆像潮水般涌来,一股是曾经的,一股是现在的。曾经的自己被心爱的女孩抛弃,伤心欲绝下,独自在江边吹着寒风,想要跳江了此残生。却天不遂愿,一道雷抢先劈死了自己。今生记忆中自己是人类主神阿琉求斯.波尔的第九神子帝摩斯.波尔,只是尴尬的是自己现在被关在父神的下位神器琉璃塔里。幸好自己还有一个分身即将苏醒,只是这个分身醒来后是自己吗?
  • 凤枕鸾帷之君生我未生

    凤枕鸾帷之君生我未生

    他轻挑起她优美的下巴,满脸温柔又带着邪笑。俊美的脸颊缓缓而下,如星的双眸勾魂摄魄般,盯得她的内心小鹿乱撞,砰砰直跳。她慌乱无措的闭上双眼,不自觉撅起粉嫩的小嘴。这一刻仿佛停顿了一个世纪之久。忽然耳边传来一串笑声,睁开双眼盯着前方手持银票笑得开怀的男人,一脸恼羞之色。“我就说你身上带了银子吧!”“你……”可恶,又骗她。竟然利用她……偷她的银子。她双颊绯红又羞又恼:自己还噘嘴,真是丢脸死了!“你刚才噘嘴是什么意思?”他再次逼近,嘴角坏笑故意调傥道。.............她一个二十一世纪的先进人类,魂穿到古代,竟然次次被他耍得团团转!墨子渊,看我不把你拿下!