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

同类推荐
  • 互联网创业前奏曲(第二部)——网站运营之人性、策略与实战

    互联网创业前奏曲(第二部)——网站运营之人性、策略与实战

    本书是《互联网创业前奏曲》系列的第二本书,是作者多年互联网实践经验和业界观察的总结,是国内罕有的关于互联网网站运营和用户心理结合的书籍,用通俗的语言阐述互联网运营背后的人性驱动。你想互联网创业吗?你是否在为找不到好的互联网运营策略和方法而发愁?你非常想了解互联网行业?你是否在为自己不了解互联网运营而苦恼?本书针对这些问题列举了很多互联网运营的案例,帮你制定运营策略,更好的修炼和提升运营功力。
  • 玩转手机

    玩转手机

    本书主要包括:手机的发展历史、手机知识、手机的选购与巧用、手机与网络、手机短信等内容。
  • 下一代互联网

    下一代互联网

    本书系统介绍了下一代互联网的进展情况,包括下一代互联网的概念解析,国内外下一代互联网的最新发展情况,下一代互联网的关键技术进展,以及各国发展下一代互联网的政策计划。最后分析了下一代互联网对未来社会的影响,提出我国发展下一代互联网的政策建议等。全书共6章,包括互联网发展历史和现状,下一代互联网基本概念,下一代互联网研究最新进展,下一代互联网发展现状,我国发展下一代互联网现状,发展下一代互联网战略建议。
  • 中国网络传播研究2009(第三辑)

    中国网络传播研究2009(第三辑)

    本文以传统社区研究的“场域论”为基础,探讨网络传播中场域性互动对社会舆论的影响。文章首先从传统社区传播的场域性特征出发,探讨网络传播的社区性和场域性。然后分别分析了传统门户、BBS论坛和私人博客等三种主流的网络传播的场域性互动、意见表达和舆论形成的特点。最后结合“张殊凡事件”、“王石捐款”事件以及“黑砖窑”事件,探讨网络传播中的场域性互动对社会舆论从虚拟到现实的影响。
  • 信息技术教育大全-操作系统大全

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

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

    复仇大小姐!重生吧

    男友给自己戴的绿帽子还真不小哈!光天化日,还在她的眼皮下秀恩爱。吃了药,本想一死了之,老天却再次让她重生。遇到自己真正的另一半。虐死你。呵,小贱人,姐姐我来一个打一个,来两个打一双!
  • 快穿宿主你别闹

    快穿宿主你别闹

    1V1论有一位懒成猪的宿主大魔王要肿么破?四喜丸子表示很惆怅,但是自己选的宿主大人跪着也要宠下去,于是四喜丸子走上了为大魔王佟tóng苒rǎn做牛做马的不归路……
  • 那蔚蓝色的星球

    那蔚蓝色的星球

    24世纪,地球资源紧缺,环境污染加剧,人类对地球的破坏越来越严重,再这样下去人类将会失去唯一的家园……于是人类为了保护地球,建立起了一个组织——世界警卫军,这是一个集环境保护、资源管理、保护地球等重大任务为一体的世界组织……
  • 朕也不想太霸气

    朕也不想太霸气

    燕晗先帝早亡,太子重病不治,十岁龙凤胎公主楚凤宸被迫女扮男装替长兄登基为帝,但朝中权臣环伺,摄政王裴毓权倾朝野,丞相沈卿之尽揽民心。女帝被几个奸臣养成了个蠢萌蠢萌的包子,处处受制,她发誓要在十五岁后亲政。包子楚凤宸发现当年青梅竹马的初恋瞿放归来。女帝于公于私都想扶持瞿放,却被瞿放再三冷漠拒绝。楚凤宸心灰意冷赐婚,拟了两道赐婚的旨意,一是赐婚瞿放与他红颜知己阮语,二是赐婚和“宁公主”与执掌律法的司律府执事顾璟。裴毓看到女帝上蹿下跳想把自己给“嫁”出去,终于忍无可忍地插手包子女帝蠢萌蠢萌的计划,却不料他的步步胁迫换来的却是女帝狼狈逃窜……
  • 傻丫头的妖孽校草

    傻丫头的妖孽校草

    白初羽一个人在那里自言语:“都怪伊芊芊,不早叫醒我!害我第一天入学就迟到,害我被老师罚写检讨,又要打扫这么大的场地……”一边埋怨着好友,一边拿着扫把出气!“啊!”不知道是疼痛地叫了一声。等白初羽清醒过来,才发现手中的扫把不知在何时飞了。听到吃痛的声音,连忙顺着声跑去:“学长,你没事吧!”用双手扶起被自咂到头的男同学,心里害怕他有个好歹。又问:“你……你,你没,没事吧?要不要我送你去校医那里……”突然抬头一看,见他玩魅诡异的笑容,惊呆了…………
  • 长眉真人专集(下)(还珠楼主小说全集)

    长眉真人专集(下)(还珠楼主小说全集)

    本书是还珠楼主的一部品质上乘的武侠小说,情节曲折动人,跌宕起伏,屠龙之手一出,看官欲罢不能。郑隐含泪应命,跪向樗散子面前,刚哭喊得一声“弟子罪该万死!”樗散子意似伤感,摇手叹道“人贵力行,不尚多言。此是你最后一次生死关头,成败在你。此是《紫清宝篆》中册,又名《九天玄经》。学成之后,只要能加功勤习,循序渐进,便是天仙也非无望。另外一部《少清秘芨》中有降魔防身诸般妙用。今赐你二人,一同练习……
  • 空间之锦绣小农女

    空间之锦绣小农女

    沈青燕意外坠楼,再次睁眼,发现自己被亲爹除族,亲母新丧,极品亲戚欺压。不过好在她有空间在手,哪怕身边有再多的极品也不怕,养个小妹那是小菜一碟。可这捡来的麻烦男人,却是腹黑男,先把自己亲妹骗过去,后再慢慢把自己往歪路上去,一步步掉进他爱的陷阱里。本文纯属虚构,请勿模仿。
  • 献花岩志

    献花岩志

    本书为公版书,为不受著作权法限制的作家、艺术家及其它人士发布的作品,供广大读者阅读交流。
  • 愿我一世喜乐无忧

    愿我一世喜乐无忧

    我叫无忧,母后希望我可以快乐无忧。可是我灾星附身,总是给身边人带来灾难,没有朋友。母后去世,没有人记得我是一位公主,从小受尽欺凌,本以为就这样浑浑噩噩的度过一生,直到遇到了衍凉......
  • 万千身份卡

    万千身份卡

    今天我有可能是学院默示录里的小胖子“大哥,别追了,跑不动了。”“嗷呃····嗷”也可能是火影里的小李“食我木叶大旋风”可能也会是海贼王中的香吉士“恶魔风脚·画龙点睛”无论我现在是谁,或者谁是我都不重要,体验万千世界···········