登陆注册
8183300000189

第189章 10 命令模式的功能,好处,或者说

为什么使用命令模式大B:“上边的代码是否看起来很傻呢,本来可以这样简单实现的。”

public class Client{

public static void main(String[]args){

Receiver receiver=new Receiver();

receiver。actionOne();

receiver。actionTwo();

}

}

public class Receiver{

public Receiver(){

//

}

public void actionOne(){

System。out。println(“ActionOne has been taken。”);

}

public void actionTwo(){

System。out。println(“ActionTwo has been taken。”);

}

}

大B:“看!多简洁。如果是像上边如此简单的需求,这个才应该是我们的选择,但是有些情况下这样的写法不能解决的,或者说解决起来不好,所以引入命令模式。1、我们须要Client和Receiver同时开发,而且在开发过程中分别须要不停重构,改名。2、如果我们要求Redo,Undo等功能。3、我们须要命令不按照调用执行,而是按照执行时的情况排序,执行。4、开发后期,我们发现必须要log哪些方法执行了,如何在尽量少更改代码的情况下实现,并且渐少重复代码。5、在上边的情况下,我们的接受者有很多,不止一个。”

小A:“当我们遇到这些情况时应该怎样去解决?”

大B:“解决办法:情况一、我们可以定义一个接口,让Receiver实现这个接口,Client按照接口调用。情况二、我们可以让Receiver记住一些状态,例如执行前的自己的状态,用来undo,但自己记录自己的状态实现起来比较混乱,一般都是一个累记录另一个类的状态。情况三、很难实现。情况四、我们须要在每个Action,前后加上log。”情况五、相对好实现,但是再加上这个,是否感觉最终的实现很混乱呢?

大B:“好,我们再来看看命令模式,在命令模式中,我们增加一些过渡的类,这些类就是上边的命名接口和命令实现,这样就很好的解决了情况一、情况二。我们再加入一个Invoker,这样情况三和情况四就比较好解决了。”

如下加入Log和排序后的。

public class Invoker{

private List cmdList=new ArrayList();

public Invoker(){

}

public add(Command command){

cmdList。add(command);

}

public remove(Command command){

cmdList。remove(command);

}

public void action(){

Command cmd;

while((cmd=getCmd())!=null){

log(“begin” cmd。getName());

cmd。execute();

log(“end” cmd。getName());

}

}

public Command getCmd(){

//按照自定义优先级,排序取出。

}

}

public class Client{

public static void main(String[]args){

Receiver receiver=new Receiver();

Command commandOne=new ConcreteCommandOne(receiver);

Command commandTwo=new ConcreteCommandTwo(receiver);

Invoker invoker=new Invoker();

invoker。add(commandOne);

invoker。add(commandTwo);

iinvoker。action();

}

}

同类推荐
  • 中文版AutoCAD2005建筑绘图精讲精学

    中文版AutoCAD2005建筑绘图精讲精学

    本书从中文版AutoCAD2005建筑绘图的基础进行介绍,讲解了建筑绘图的环境设置、二维建筑图形的绘制、二维建筑及装饰图形的编辑、建筑绘图中的文字标注和图形查询、建筑装潢平面图中的尺寸标注、建筑绘图中图块的应用、建筑平面图的绘制、建筑立面图的绘制、建筑剖面图的绘制、建筑绘图中的三维造型、三维建筑模型绘制及建筑图纸的布局与打印输出等内容。
  • 《Internet实用技术》作业集

    《Internet实用技术》作业集

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

    体感交互技术

    本书提出了体感计算的研究,探讨了基于体验性认知的个性化电子学习方式,并且分析了面向儿童的艺术创造体验,在体感虚拟化身的帮助下,用户可以通过身体运动,促进情感心智的全面发展,
  • 云计算和现代远程教育

    云计算和现代远程教育

    本书介绍了云计算知识、云计算的特性、云计算技术、云计算中的访问云、云计算中的云存储、云计算在远程教育中的应用等内容。
  • 纵横于天地之间——互联网络技术

    纵横于天地之间——互联网络技术

    本书告诉你:不管你是谁,只要生活在当前的时代,你一定知道电话,知道电脑,知道上网……知道许许多多关于电子、关于计算机、关于网络的话题,这就是网络时代。网络的话题可多了:它是怎么来的?什么是“蜘蛛网”?网络的过去和现在,上网的方法,如何使用网络,互联网的安全,网络有“陷阱”吗?网络有“瘾”吗?网络文化和未来又是怎样的?到书中去找答案吧!
热门推荐
  • 幻想语物

    幻想语物

    不知道以后的创作方向是什么,暂时不做作品简介,新人写手,不喜轻喷。
  • 傲世登仙

    傲世登仙

    世事飘渺,空古悠悠,逍遥万里却寂寥;问天地苍茫,仙路何方?又有谁堪携手天涯!时光匆匆飞逝,青丝转头白发,生死几人勘透?纵是王侯霸业、娇羞容颜,到头不过黄土封尘、骷髅红粉!试问万丈红尘,不死长生几人得?杨帆踏着修行的漫漫长道,揭开一个又一个的上古谜团;追寻着仙的足迹,踏上无上仙途!只愿仗剑天涯驰骋,携手佳人万里遨行!
  • 快穿攻略之宿主请您听话

    快穿攻略之宿主请您听话

    迪脂作为快穿部门里最不好控制的一个宿主让她攻略渣男男主就攻略专情男二手撕cp、骂跑白莲花、装绿茶婊什么都干过要不是快穿部门里人员短缺,迪脂还属于演技特好的那类型。真的很欠打……迪脂负责在每个崩坏的小说世界里,给那些小女配一个逆袭的机会。(本文完完全全没有虐点,苏爽文。女主超级搞笑。保证看个舒服)
  • 梦境守望者

    梦境守望者

    嘛,我自己都不知道怎么介绍来着,姑且就这样啦
  • 女王爷之杏花树等你

    女王爷之杏花树等你

    描述一对很普通夫妻,遇见7年之痒很疲惫。各种矛盾的出现。让她们对婚姻生活,无比失望打算去离婚,没想到在去的路上发生了车祸。生死未知。女子是莫名其妙的穿越到古代,当上这个国家的女王爷,遇见了那个他……坚决不烂尾。
  • 快穿之踹翻这碗狗粮

    快穿之踹翻这碗狗粮

    平行时空错乱,各路男女主人设齐刷刷崩塌,剧情堪比老太太的裹脚布,星际观众表示心累。“大哥,男女主烂就烂了,剧情不能烂啊,没点看点还播什么?”面对这样的情况,单身狗系统决定联手余悄悄改变世界!【冲啊!踹翻这碗狗粮!】“冲啊!踹翻这碗狗粮!”……【悄啊你怎么悄悄脱单了?!】“我不是我没有你别乱说。”余悄悄躺在某人怀里,含糊回答道。单身狗系统:为什么它要一边鼓励宿主拆cp一边看宿主撒狗粮?
  • 妙不可缘

    妙不可缘

    整治渣男,智斗白莲!要问我李一清为什么这么做?因为我要代表正义消灭你们!
  • 忘尘轩

    忘尘轩

    一生一念一笔墨.一山一水一梦牵.一琴一曲一心醉.一俯一仰一流连.一回首,一思量.墨痕过处,青花盛放.忘尘轩里有位天赋异禀的奇女子,没人知道她的身份,传说她能让世人得到他们最想要的东西。然,要想得到所渴望的,就要失去所拥有的……
  • 天行

    天行

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

    寒渊冰语

    旧日的世界开始破碎,埋葬着属于过去的自己。当和平与安宁的过往不在,渴求着力量的低语此起喧嚣,那是比妖魔更可怕的人心。当他睁开眼睛的时候,世界已经变成了这个样子。逃亡至深山老林中,生活在妖魔不屑理会的废地,终究还是要踏出去的。