炫浪模式模拟器怎么玩

17:36 上传
17:36 上传
《穿书之徒弟是反派/坑爹的人生赢家模式[穿书] 番外》BY南绻 TXT下载
*j*榜推高人气VIP完结
非V章节总点击数:601100   总书评数:1181 当前被收藏数:4886 文章积分:37,945,836
顾子舒受到剧情大神的邀请,穿越到一本种马文中,成为拯救世界的主角。
他的任务就是干掉大反派弑阳,阻止世界毁灭。
作为主角,他觉得自己最大的福利,就是在后山捡了一个乖巧懂事的徒弟。却不知他以为的乖徒弟,正是他心心念念想要干掉的弑阳。
于是,这是一个“双耳不闻种马事,一心养成乖徒弟”的主角,喜闻乐见地被徒弟吃掉的故事。
正义温润师尊受X精分丧病徒弟攻
小攻属性:在师尊面前是纯洁无暇的小白花,在外人面前是无三观的夺命罗刹。
伪.小白花顾夜(弑阳)苍白着小脸瑟瑟发抖地举起刀将面前敌人劈得四分五裂,在一片血色中眼泪汪汪对师尊说:师尊别怕,我,我来救你。
顾子舒老怀安慰,感动道:好徒儿……是为师没用,徒儿可小心些。
顾夜:嘤嘤好可怕……
众人一脸血:大尾巴嗜血狼你装什么小白兔!
阅读指南:
1.主受,1V1,HE
2.穿书+养成
3.作者是傻白甜逻辑死星人,只想让儿子和儿子谈一场脑残的恋爱
内容标签: 年下 甜文
搜索关键字:主角:顾子舒,顾夜(弑阳) ┃ 配角: ┃ 其它:
穿书之徒弟是反派.txt
17:37 上传
点击文件名下载附件
下载积分: 炫币 -2 个
659.08 KB, 下载次数: 788, 下载积分: 炫币 -2 个
&冷香小筑之雪雪都说一般,那肯定相当一般,文案来看也不喜欢,听人劝吃饱饭,就不渡这个劫了&
&楼下竟然换台词了,Σ( ° △ °|||)︴&
&闲时可看&
&在傻白甜的基础上没多大硬伤,如果喜欢这种文风就看看吧&
&有的东西就能不在意 弄得当代的人好像都不会察言观色留个心眼一样= =&
&老梗但是我就是爱这种梗!虽然如此但这文攻受真的很一般!受已经不能用白目来说了 脑洞大的那么多都能省略掉 别说因为是穿越过去的&
&老梗,可是文笔还停留在作的阶段。。。渡劫失败&
&这梗已写到老掉牙,所以就指望文笔了,翻了几页表示,文荒将就看,过断弃之&
UID1202561积分1549 分炫币2614 个主题帖子阅读权限50注册时间最后登录
, 积分 1549, 距离下一级还需 1451 积分
TA的每日心情祈祷 22:40签到天数: 193 天[LV.7]常住居民III
有人渡劫么_(:з」∠)_
无效楼层,该帖已经被删除
UID1267984积分60 分炫币219 个主题帖子阅读权限10注册时间最后登录
, 积分 60, 距离下一级还需 90 积分
TA的每日心情无聊 09:15签到天数: 18 天[LV.4]偶尔看看III
看着简介挺有趣的,希望中间不要大虐啊!
UID1227793积分1146 分炫币2884 个主题帖子阅读权限50注册时间最后登录
, 积分 1146, 距离下一级还需 1854 积分
TA的每日心情开心 09:04签到天数: 129 天[LV.7]常住居民III
说实在的,这种设定也很老套了,全靠作者功力才能写好,写不好就容易崩
UID207099积分359 分炫币375 个主题帖子阅读权限30注册时间最后登录
, 积分 359, 距离下一级还需 641 积分
该用户从未签到
有人看过了吗?好看不?
UID1134533积分2016 分炫币5157 个主题帖子阅读权限50注册时间最后登录
, 积分 2016, 距离下一级还需 984 积分
TA的每日心情开心 13:16签到天数: 345 天[LV.8]以坛为家I
硝化菌 发表于
说实在的,这种设定也很老套了,全靠作者功力才能写好,写不好就容易崩
是的,文笔很重要啊,文笔弱智的话就算题材新颖都会让人看不下去呢
UID681727积分2014 分炫币4205 个主题帖子阅读权限50注册时间最后登录
, 积分 2014, 距离下一级还需 986 积分
TA的每日心情无聊 22:55签到天数: 332 天[LV.8]以坛为家I
这样懒大街的梗,写不好真的很废的
UID406711积分4141 分炫币7049 个主题帖子阅读权限80注册时间最后登录
, 积分 4141, 距离下一级还需 1859 积分
TA的每日心情开心 11:00签到天数: 13 天[LV.3]偶尔看看II
我就想知道这作者写的好不好
UID848114积分2155 分炫币8208 个主题帖子阅读权限50注册时间最后登录
, 积分 2155, 距离下一级还需 845 积分
TA的每日心情开心 00:45签到天数: 516 天[LV.9]以坛为家II
徒弟是腹黑啊腹黑!师傅蠢萌。
年初一正式发放马年勋章
发表内容请遵守中国之法律法规 公安备案编号:0
网友发布或转载自互联网的内容,纯属个人行为,与本网站立场无关
内容所述观点仅代表发帖对象之观点,真实性炫浪网无法查证,特此声明当前位置: >
> 炫舞浪漫爱
炫舞浪漫爱有0点赞
游戏类型:
游戏画面:3D
游戏题材:可爱
收费模式:道具收费
游戏厂商:百度移动
运营状态:公测
2015年年度最炫最浪漫的3D音乐舞蹈类手游火爆来袭!时尚帅气的人物造型,酷炫华丽的舞美灯光,让你在近百首时尚舞曲中根本停不下来,全场领嗨!创立舞团,共建家族,不比战力只比帅!上百款流行服饰,自由组合,无论你是高冷女王,还是呆萌小萝莉;不管你是霸道总裁,亦或是帅气小正太,随你百搭任你组合!每天都是你的Style主场!每天你都是万众瞩目的时尚领袖!还在等什么~赶快舞动指尖俘获爱,一起炫舞浪漫爱! 
时尚交友手游《炫舞浪漫爱》又将开启全新玩法“炫浪模式”,如此一来,《炫舞浪漫爱》手游就集齐了5大玩法模式!那让们下面一起回顾一下,《炫舞浪漫爱》都有哪些好玩的玩法吧!
发布时间:
如今开学版本更新!炫酷座驾可以在游戏里随便自由移动啦!炫酷达人扎堆的时尚交友手游《炫舞浪漫爱》手游中,没有点与众不同的道具怎么能凸显个性。如今,座驾在房间里想怎么玩就怎么玩,小伙伴们...
发布时间:
在四处都洋溢着圣诞气氛的今天,你是否却在为自己孤单一人怎么过节而苦恼呢?不用犯愁,由百度移动独家代理的时尚交友3D音乐舞蹈手游《炫舞浪漫爱》今日浪漫公测。
发布时间:
时尚交友手游《炫舞浪漫爱》精英内测火爆进行中,游戏的玩法也得到了曝光。据悉,《炫舞浪漫爱》结合玩家操作习惯,设置了泡泡、节奏、传统等多重玩法类型。
发布时间:
手机玩炫舞,全民浪漫爱!百度移动游戏独代的时尚交友手游《炫舞浪漫爱》 今日正式开启精英内测。游戏中玩家可以酷炫装扮、尽情邀舞邂逅浪漫,代言人活动也正式启动。
发布时间:
时尚交友手游《炫舞浪漫爱》又将开启全新玩法“炫浪模式”,如此一来,《炫舞浪漫爱》手游就集齐了5大玩法模式!那让们下面一起回顾一下,《炫舞浪漫爱》都有哪些好玩的玩法吧!
发布时间:
如今开学版本更新!炫酷座驾可以在游戏里随便自由移动啦!炫酷达人扎堆的时尚交友手游《炫舞浪漫爱》手游中,没有点与众不同的道具怎么能凸显个性。如今,座驾在房间里想怎么玩就怎么玩,小伙伴们...
发布时间:
在四处都洋溢着圣诞气氛的今天,你是否却在为自己孤单一人怎么过节而苦恼呢?不用犯愁,由百度移动独家代理的时尚交友3D音乐舞蹈手游《炫舞浪漫爱》今日浪漫公测。
发布时间:
时尚交友手游《炫舞浪漫爱》精英内测火爆进行中,游戏的玩法也得到了曝光。据悉,《炫舞浪漫爱》结合玩家操作习惯,设置了泡泡、节奏、传统等多重玩法类型。
发布时间:
手机玩炫舞,全民浪漫爱!百度移动游戏独代的时尚交友手游《炫舞浪漫爱》 今日正式开启精英内测。游戏中玩家可以酷炫装扮、尽情邀舞邂逅浪漫,代言人活动也正式启动。
发布时间:
微信扫一扫免费领取游戏礼包
1、用手机微信扫一扫左边的二维码,即可免费领取手游限量礼包
2、在公众号(aiyouxibao)回复相应的数字,即可获得相应礼包
3、如果已成功领取手游礼包,微信将会自动把游戏礼包CDK发送给您,请及时激活使用
4、更多游戏礼包请关注游戏宝手游网微信公众帐号:aiyouxibao
*网友评论仅代表其个人看法,并不表明本站同意其观点及描述。
手游周天下101期
热游速递第12期
新游推荐第30期当前位置导航:>>&&&&
求同存异——Java模式系列谈之模板方法
一、引言& 不可否认,编代码、写程序,编的写的其实是人的思想;而设计模式更是这种思想的总结。&求同存异&是周总理的著名外交思想之一,&求同&就是寻求相同的地方,并且来解决它;&存异&就是搁置不同的地方,搁置的意思不是不解决,而是留待后面去解决。在设计模式中,模板方法正是体现了这种思想的典范。模板方法,定义一个操作中算法的骨架,将一些步骤的执行延迟到其子类中。其中,这些在父类中实现了的步骤就是所谓的&同&,&求同&就是在父类中把相同的功能先实现;而那些延迟到子类中的步骤就是所谓的&异&,&存异&就是把不同在父类中遗留下来,到子类中去各个实现。在实际的工作中,经常会遇到这样的情况:有一序列的功能相同的模块,这些模板有很多相同或相似的步骤;当然,也有一个或两个不同的步骤。如,有在线购物功能的网站,经常要对商品进行各种各样的排名:按商品的点击率排名、按商品的购买率排名、按商品的入站时间排名、按商品的类别进行的搜索等等。这些都是一些搜索功能,功能完全相同;不同的要么是搜索的算法、要么是搜索的数据表不同。我们知道,如果采用Struts模式的开发方法,那么我们所有的这些功能的实现都是在一个继承了Action类的public ActionForward execute ( ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response)中实现,这里需要实现的功能有:取得进行搜索所需要的各种条件,进行搜索算法、处理搜索结果。在这里,取得搜索所需的条件和处理搜索结果的算法是一样的,他们将产生相同的代码。不同的只是进行搜索的算法。很明显,相同的代码是需要我们进行重用的。那么我们该怎么重用呢?二、从一段代码谈起首先需要说明的是:这段代码是一段反面的代码,或者说是一段坏的代码。每个人看了都会觉得不可思议,但这确确实实是我们工作中遇到的代码:public class ToSpeAction extends Action {&& public ArrayList&&&&&& sizeRangeLabel& =&& public ActionForward execute ( ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) {&&&&&&&&&&& if (&Save&.equalsIgnoreCase (action)) {&&&&&&&&& &&&&&& StringBuffer productIDStr = new StringBuffer ( );&&&&&&&&& &&&&&& StringBuffer speciStr = new StringBuffer ( );&&&&&&&&& &&&&&& SpeciManager.getInstance ( ).saveHeadData (actionForm, request, productIDStr, speciStr, &specification&);&&&&&&&&& &&&&&& specId = speciStr.toString ( );&&&&&&&&& &&&&&& ProductID = productIDStr.toString ( );&&&&&&&&& &&&&&& form.set (&ProductID&, ProductID);&&&&&&&&& &&&&&& form.set (&specId&, specId);&&&&&&&&& }&&&&&&&&&&& //grid&&&&&&&&& if (tab.equals (&0&)) { //spec&&&&&&&&& &&&&&& GridDataSummary gdSmy = new GridDataSummary (specId);&&&&&&&&& &&&&&& gdSmy.specBaseData.setTransform (transform);&&&&&&&&& &&&&&& gdSmy.specBaseData.setPrevTransform (prevTransform);&&&&&&&&& &&&&&& gdSmy.specBaseData.setTextRangeSizeSrc ((String) form.get (&sizeRangeIDesc&));&&&&&&&&& &&&&&& gdSmy.specBaseData.setSortPomStr (sortPomStr);&&&&&&&&& &&&&&& gdSmy.specBaseData.setGradeRuleId ((String) form.get (&ddlGuleVule&));&&&&&&&&& &&&&&& gdSmy.specBaseData.setSizeChangeflag ((String) form.get (&sizeChangeFlag&));&&&&&&&&& &&&&&& gdSmy.specBaseData.setHidePOMCode (&Hide&.equalsIgnoreCase (hidePOMCode) ? true : false);&&&&&&&&&&&&&&&&& if (&&.equalsIgnoreCase (action)) {&&&&&&&&&&&&&&&& &&&&&& load (request, gdSmy);&&&&&&&&&&&&&&&& } else if (&load&.equalsIgnoreCase (action)) {&&&&&&&&&&&&&&&& &&&&&& //grid data&&&&&&&&&&&&&&&& &&&&&& load (request, gdSmy);&&&&&&&&&&&&&&&& } else if (&Save&.equalsIgnoreCase (action)) {&&&&&&&&&&&&&&&& &&&&&& //Save measure table data&&&&&&&&&&&&&&&& &&&&&& save (request, gdSmy, form);&&&&&&&&&&&&&&&& &&&&&& &&&&&&&&&&&&&&&& &&&&&& load (request, gdSmy);&&&&&&&&&&&&&&&& } else if (&refGrid&.equalsIgnoreCase (action)) {&&&&&&&&&&&&&&&& &&&&&& &&&&&&&&&&&&&&&& &&&&&& String xmlData = refGrid (specXMLStr, gridModel, gdSmy);&&&&&&&&&&&&&&&& &&&&&& LoggerAgent.debug (&grid business done&&&& ......\nthe xml data is & + xmlData);&&&&&&&&&&&&&&&& &&&&&& request.setAttribute (&xmlString&, xmlData);&&&&&&&&&&&&&&&&& &&&&&& //&&&&&&&&& 判定弹出用户自定义排序窗体,并作业务上的处理&&&&&&&&&&&&&&&& &&&&&& if (GridDataConstant.STR_TRUE.equals (request.getParameter (&popUpDefSort&))) {&&&&&&&&&&&&&&&& &&&&&& &&&&&& request.setAttribute (&popUpDefSort&, &true&);&&&&&&&&&&&&&&&& &&&&&& &&&&&& request.getSession ( ).setAttribute (&pomLst&, gdSmy.getPomLst ( ));&&&&&&&&&&&&&&&& &&&&&& }&&&&&&&&&&&&&&&& }&&&&&&&&& } else if (tab.equals (&1&)) { //increaments&&&&&&&&& &&&&&& GridDataGrdInc gdInc = new GridDataGrdInc (specId);&&&&&&&&& &&&&&& gdInc.specBaseData.setTransform (transform);&&&&&&&&& &&&&&& gdInc.specBaseData.setPrevTransform (prevTransform);&&&&&&&&& &&&&&& gdInc.specBaseData.setTextRangeSizeSrc ((String) form.get (&sizeRangeIDesc&));&&&&&&&&& &&&&&& gdInc.specBaseData.setSortPomStr (sortPomStr);&&&&&&&&& &&&&&& gdInc.specBaseData.setGradeRuleId ((String) form.get (&ddlGuleVule&));&& &&&&&& &&&&&& gdInc.specBaseData.setSizeChangeflag ((String) form.get (&sizeChangeFlag&));&&&&&&&&&& &&&&&& gdInc.specBaseData.setHidePOMCode (&Hide&.equalsIgnoreCase (hidePOMCode) ? true : false);&&&&&&&&&&&&&&&&& if (&&.equalsIgnoreCase (action)) {&&&&&&&&&&&&&&&& &&&&&& load (request, gdInc , gridModel);&&&&&&&&&&&&&&&& } else if (&load&.equalsIgnoreCase (action)) {&&&&&&&&&&&&&&&& &&&&&& //grid data&&&&&&&&&&&&&&&& &&&&&& load (request, gdInc , gridModel);&&&&&&&&&&&&&&&& } else if (&Save&.equalsIgnoreCase (action)) {&&&&&&&&&&&&&&&& &&&&&& //Save measure table data&&&&&&&&&&&&&&&& &&&&&& save (request, gdInc, form);&&&&&&&&&&&&&&&& &&&&&& gridModel = (GridControlModel) form.get (&gridModel&);&&&&&&&&&&&&&&&& &&&&&& load (request, gdInc, gridModel);&&&&&&&&&&&&&&&& } else if (&refGrid&.equalsIgnoreCase (action)) {&&&&&&&&&&&&&&&& &&&&&& String xmlData = refGrid (specXMLStr, gridModel, gdInc);&&&&&&&&&&&&&&&& &&&&&& LoggerAgent.debug (&grid business done&&&& ......\nthe xml data is & + xmlData);&&&&&&&&& &&&&&& &&&&&& request.setAttribute (&xmlString&, xmlData);&&&&&&&&&&&&&&&&& &&&&&& //&&&&&&&&&&&&& 判定弹出用户自定义排序窗体,并作业务上的处理&&&&&&&&&&&&&&&& &&&&&& if (GridDataConstant.STR_TRUE.equals (request.getParameter (&popUpDefSort&))) {&&&&&&&&&&&&&&&& &&&&&& &&&&&& request.setAttribute (&popUpDefSort&, &true&);&&&&&&&&&&&&&&&& &&&&&& &&&&&& request.getSession ( ).setAttribute (&pomLst&, gdInc.getPomLst ( ));&&&&&&&&&&&&&&&& &&&&&& }&&&&&&&&&&&&&&&& }&&&&&&&&& } else if (tab.equals (&2&)) { //measurements&&&&&&&&& &&&&&& GridDataGrdMeas gdInc = new GridDataGrdMeas (specId);&&&&&&&&& &&&&&& gdInc.specBaseData.setTransform (transform);&&&&&&&&& &&&&&& gdInc.specBaseData.setPrevTransform (prevTransform);&&&&&&&&& &&&&&& gdInc.specBaseData.setTextRangeSizeSrc ((String) form.get (&sizeRangeIDesc&));&&&&&&&&& &&&&&& gdInc.specBaseData.setSortPomStr (sortPomStr);&&&&&&&&& &&&&&& gdInc.specBaseData.setGradeRuleId ((String) form.get (&ddlGuleVule&));&&&&&&&&& &&&&&& gdInc.specBaseData.setSizeChangeflag ((String) form.get (&sizeChangeFlag&));&&&&&&&&& &&&&&& gdInc.specBaseData.setHidePOMCode (&Hide&.equalsIgnoreCase (hidePOMCode) ? true : false);&&&&&&&&&&&&&&&& if (&&.equalsIgnoreCase (action)) {&&&&&&&&&&&&&&&& &&&&&& load (request, gdInc);&&&&&&&&&&&&&&&& } else if (&load&.equalsIgnoreCase (action)) {&&&&&&&&&&&&&&&& &&&&&& //grid data&&&&&&&&&&&&&&&& &&&&&& load (request, gdInc);&&&&&&&&&&&&&&&& } else if (&Save&.equalsIgnoreCase (action)) {&&&&&&&&&&&&&&&& &&&&&& //Save measure table data&&&&&&&&&&&&&&&& &&&&&& save (request, gdInc, form);&&&&&&&&&&&&&&&& &&&&&& gridModel = (GridControlModel) form.get (&gridModel&);&&&&&&&&&&&&&&&& &&&&&& load (request, gdInc);&&&&&&&&&&&&&&&& } else if (&refGrid&.equalsIgnoreCase (action)) {&&&&&&&&&&&&&&&& &&&&&& String xmlData = refGrid (specXMLStr, gridModel, gdInc);&&&&&&&&&&&&&&&& &&&&&& LoggerAgent.debug (&grid business done&&&& ......\nthe xml data is & + xmlData);&&&&&&&&&&&&&&&& &&&&&& request.setAttribute (&xmlString&, xmlData);&&&&&&&&&&&&&&&& &&&&&& //判定弹出用户自定义排序窗体,并作业务上的处理&&&&&&&&&&&&&&&& &&&&&& if (GridDataConstant.STR_TRUE.equals (request.getParameter (&popUpDefSort&))) {&&&&&&&&&&&&&&&& &&&&&& &&&&&& request.setAttribute (&popUpDefSort&, &true&);&&&&&&&&&&&&&&&& &&&&&& &&&&&& request.getSession ( ).setAttribute (&pomLst&, gdInc.getPomLst ( ));&&&&&&&&&&&&&&&& &&&&&& }&&&&&&&&&&&&&&&& }&&&&&&&&& }&&}&很乱的一大段代码,被我剪裁下去了很多,但依然还有很大的几页。这段代码实现了什么功能,从现在的代码上看,就已经很让人头疼了,更不要提看原来的代码。通过了解需求,我才明白这段代码的功能:有几个大部分功能相似的页面,每个页面都有相似的功能,如显示数据、保存数据和刷新数据。作者将不同的页面、不同的功能都实现在了一个类里。在上面的代码中,变量tab是用来区别不同的页面的,而action是用来区别不同的动作,如显示、保存、刷新的。我这样一说,大家都恍然大悟:好家伙,这个类的功能也够强大了的。作者这样写,最重要的原因恐怕是为了代码的重用:因为不管是不同的页面、还是不同的动作,他们都有很多相同或相似的功能,即有需要重用的代码,把他们放在一个类里面,就保证了代码的重用。大家都知道那是不好的代码,不好在那里呢?单一职责原则&&SRP就一个类而言,应该仅有一个引起它的变化的原因。原则&&最简单,最单纯的事情最容易控制,最有效。类的职责简单而且集中,避免相同的职责分散到不同的类之中,避免一个类承担过多的职责;减少类之间的耦合;当需求变化时,只修改一个地方。组件&&每个组件集中做好一件事情。方法&&避免写臃肿的方法。单一职责原则告诉我们,类的功能要单一。这样的好处是多方面的:第一,开发思路清晰,不容易出错。第二,单元测试容易。第三,代码功能简单明了,交流容易。第四,维护容易。根据SRP原则,上面的一个类需要用若干个类来实现,每一个类只实现一个页面的一个功能。确立了这么一个原则,那么下面的问题就是:我们在这些类里有很多相同的代码,怎么实现这些代码的重用呢?第三、问题的解决最近我们做的一个项目,产品的生命周期管理系统,我们需要对产品的各个方面进行管理,如产品的总属性、结构、颜色、来源等等。而每一个方面的管理又有两个基本的操作&&察看和修改保存。我们来看使用模板方法对上述问题的解决方法:首先我们构造一个抽象类:CommonAction,该类继承了Action,如下:public abstract class CommonAction extends Action{实现public final ActionForward execute(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response)方法,注意:为了CommonAction类的子类不能覆盖这个方法,我们使用了final关键字。public final ActionForward execute(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response){接下来,我们来实现一些公用代码:String productId = TransformTools.getObjectString(request.getParameter(&ProductID&),&1&); &&&&&& &String nodeID = TransformTools.getObjectString(request.getParameter(&nodeID&));&&&&&&& &&&&&&& request.setAttribute(&ProductID&,productId);&&&&&&& request.setAttribute(&nodeID&,nodeID);&&&&&&& String tabId = &&;&&&& &&&&&& setTabList(request,productId);&&&&&&& &&&&&&& FBProduct product = new FBProduct(new Long(productId));&&&&&&& &&&&&&& CommonBean bean=new CommonBean();&&&&&& &&&&&&& bean.setNodeId(nodeID);&&&&&&& bean.setProduct(product);&&&&&&& bean.setProductId(productId);&&&&&&& bean.setTabId(tabId);上面是一些公用代码,每一个子类都需要用同样的方法来取得的一些参数和数据。下面是调用需要子类来实现的方法:&&&&&&& &&&&&& doWithDb(actionForm,request,response,bean)最后又是对公用代码的调用:&&&&&&& &&&&&& return setActionForward(actionMapping,actionForm,request,response,bean);}至此,我们看到public final ActionForward execute(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response)方法已经完成。我们来看该方法内所调用的方法的实现:首先是public ActionForward setActionForward(ActionMapping actionMapping,ActionForm actionForm, HttpServletRequest request, HttpServletResponse response,CommonBean bean)方法,该方法有一个默认的实现,用来实现该跳转功能的绝大多数的功能实现,就是跳转到&success&;当然,有些时候我们不是这么简单的跳转,而需要做一些变化,没关系,在子类中,你可以覆盖这个方法:public ActionForward setActionForward(ActionMapping actionMapping,ActionForm actionForm, HttpServletRequest request, HttpServletResponse response,CommonBean bean)&&&&&& {&&&&&& &&&&&& return actionMapping.findForward(&success&);&&&&&& }同样:protected void setTabList(HttpServletRequest request,String productId)&&&&&& {&&&&&& &&&&&& ArrayList list = new ArrayList();&&&&&&& list = FormDataAccess.getProductFormList(productId);&&&&&&& request.setAttribute(&TabList&, list);&&&&&&& request.setAttribute(&tabName&, &Construction&);&&&&&& }protected final void setSelectToRequest(HttpServletRequest request,Object o)&&&&&& {&&&&&& &&&&&& HashMap map = getMap(&getMap&,o);&&&&&&& Object[] keys=map.keySet().toArray();&&&&&&& for(int i=0;i&keys.i++)&&&&&&& {&&&&&&&&& request.setAttribute(keys[i].toString(),map.get(keys[i].toString()));&&&&&&& }&&&&&& }private HashMap getMap(String methodName,Object o)&&&&&& & {&&&&&& &&& try&&&&&& &&& {&&&&&& &&&&&& &&& Class c=o.getClass();&&&&&& &&&&&& &&& Class[] types=new Class[]{};&&&&&& &&&&&& &&& Object[] args=new Object[]{};&&&&&& &&&&&& &&& Method m=c.getMethod(methodName,types);&&&&&& &&&&& return (HashMap)m.invoke(o,args);&&&&&& &&& }&&&&&& &&& catch(Exception e)&&&&&& &&& {&&&&&& &&&&& e.printStackTrace();&&&&&& &&&&&&&&&&& & &&}&&&&&& & }最后,我们将doWithDb方法留给子类实现:protected abstract void doWithDb(ActionForm actionForm, HttpServletRequest request, HttpServletResponse response,CommonBean bean);}关键字abstract表明doWithDb是抽象方法,是需要在子类中实现的方法。到此,我们的CommonAction类功能完成。而在子类中,我们只需要实现protected void doWithDb(ActionForm actionForm, HttpServletRequest request, HttpServletResponse response,CommonBean bean)方法就行,如下:public class ToConstructionAction extends CommonAction{&&&&&&& protected void doWithDb(ActionForm actionForm, HttpServletRequest request, HttpServletResponse response,CommonBean bean)&&&&&& {&&&&&& &&&&&& FBProduct product=bean.getProduct();&&&&&& &&&&&& T_TrimConstruction trimConstruction=(T_TrimConstruction)product.getTabInstance(BaseElementConst.FT_TRIM_CONSTRUCTION ,bean.getNodeId(),BaseElementConst.LIB_FORM_TRIM_CONSTRUCTION,null,request);&&&&&& &&&&&& FTFormParam param = (FTFormParam)trimConstruction.getFormParam();&&&&&&& param.setNodeID(bean.getNodeId());&&&&&&& param.setObjectId(bean.getProductId());&&&&&&& param.setDetail_Object(&1&);&&&&&&& trimConstruction.LoadData(true,param);&&&&&&& &&&&&&& &&&&&&& LE_TrimConstruction construction=(LE_TrimConstruction)trimConstruction.getSectionBase(&LE_TrimConstruction&);&&&&&&& &&&&&&& DynaActionForm form=(DynaActionForm)actionF&&&&&&& &&&&&&& String[] types=(String[])form.get(&ddlLabelType&);&&&&&&& if(types==null||types.length==0)&&&&&&& {&&&&&&& &&&&& String[] typess=construction.getFabric().getLabelTypeList();&&&&&&& &&&&&& request.setAttribute(&types&,typess);&&&&&&& &&&&&& form.set(&ddlLabelType&,typess);&&&&&&& }&&&&&&& else&&&&&&& {&&&&&&& &&&&&& request.setAttribute(&types&,types);&&&&&&& }&&&&&&& &&&&&&& ConstructionDataManager.setWebData(form,request,construction.getFabric());&&&&&&& &&&&&&& setSelectToRequest(request,construction);&&&&&&& request.setAttribute(&tabName&, &Construction&);&&&&&&& request.setAttribute(&TitleMenu&, &LibraryTrimConstruction&);&&&&&& }&}第四、总结由上面的例子,可以看出:如果存在这样一种情况&&各类中有同一个方法,在这个方法中,我们要实现一些同样的代码,也有一些不同的代码,形如下面的模式:public Class ClassName{&&&&&&& public functionName()&&&&&&& {&&&&&&&&&&&&&& //重用的代码&&//各自不同的代码&&&&&&&&&&&&&&& }}这样,我们可以做一个抽象类,在该类中,我们将重用的代码实现,而将不能重用的代码延迟到子类中实现:public abstract Class CommonClassName{&&&&&&& public final functionName()&&&&&&& {&&&&&&&&&&&&&& //重用的代码publicFunction(&);//各自不同的代码privateFuction(&);&&&&&&&&&&&&& }&&&&&& &&&&&& protected publicFunction(&)&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&& //重用的代码&&&&&&&&&&&&& &&&&&& &&&&&&&&&&&&&&& }&&&&&&&&&&&&& public abstract privateFuction(&);}子类:public Class SonClassName extends CommonClassName{&&&&&&& public privateFuction(&)&&&&&&& {&&&&&&&&&&&&&& //各自不同的代码&&&&&&& &&&&&& &&}}我们来看,将相同的代码在父类中先实现,而将不同的代码延迟到子类中实现,这是不是&求同存异&呢?有了模板方法模式,关于上面的一个很烂冗长的代码是不是有了解决办法,既做到了满足面向对象的单一职责原则,又重用了代码。&& 模板方法可以说是所有模式中最简单、最常用的模式,我们应该熟练的掌握。
上一篇: 下一篇:
赞助商链接

我要回帖

更多关于 炫浪网络社区 的文章

 

随机推荐