Command(命令)模式..docx
设计模式-Command(吩咐)模式GoFt将一个恳求封装为一个对象,从而使你可用不同的恳求对客户进行参数华:对恳求排队或记录恳求日志,以及支持克撤销的操作。在网上查找COmmand模式的相关资料,大多都是关于用户界面的。可能和GoF的先入为主有关系,在GoF的书中,四位作者举/个文本编辑器的例子.Command模式通过将恳求本身变成一个对象来使工具箱对象可向未指定的应用对象提出恳求。这个对象可被存储并像其他对象一样被传递。记得以前在设计模式精解的读书笔记中学习了几条阅历,其中条是:留意封装改变点。在Command模式中就是对改变点的典型封装在Command模式中有一个关键的抽象类,一般人们命名为Command类。他定义了一个执行操作的接口。它有一个抽象的execute操作。具体的Command子类(维承自Command的具体类)将接收者(ReCeiver类)作为其一个事例变量,并实现execute操作,指定接收者实行的动作。而接收者有执行该恳求所须要的具体信息“卜面举个例子:先定义关键的COmmand抽敞类(这里也可以用接口):packageCommand;publicabstractclassCommandEE(protectedReceiverreceiver;publicCommand(Receiverreceiver)(this.receiver=receiver;卜endCommand(.)Iabstractpublicvoide×ecute();Il-endabstractclassCommand再维承一个具体类rpackageCommand;publicclassConcreteCommandextendsCommandCE(IpublicConcreteCommand(Receiverreceiver)<super(receiver);->endConcreteCommand(.)Ipublicvoide×ecute()<recelver.action();1ende×ecute()endclassConcreteCommand定义Receiver%:packageCommand;publicclassReceiverEpublicvoidaction()H<System.out.println("Recelver.Actlon()");endAction()I1)edclassReceiver定义,个InVOker炎:packageCommand;classInvokerEprivateCommandcommand;publicvoidSetCommand(Commandcommand)thismand=command;I-endSetCommand(.)publicvoide×ecuteCommand()E<command.e×ecute();endexecuteCommand()l)endclassInvoker城终是调用:packageCommand;publicclassCommandPattemIIII-II的IReceiverrceiver=newReceiver();Commandcommand=newConcreteCommand(rceiver);InvokerInvoker=newInvoker();*CreatesanewinstanceofCommandPattern*/publicCommandPatternO(endCommandPatternpublicvoidShowCommandRatternOinvoker.setCommand(command);invoker.executeCommand();)endShowCommandPatternOpublicstaticvoidmain(Stringargs)System.out.println("");System.out.println("TheCommandPattern!");CommandPatterncp=newCommandPattern();cp.ShowCommandPatternO;System.out.println("");endmain(.)下面给出UM1.图,看一下他们之间的关系:1./endclassCommandPattern关于Command模式的学问在GoF的书里还介绍了好多,在我所做过的项目中始终也没有用到过Command模式所以在这里也就不多说了,具体的还是参考GOF的书吧。设计模式之Command板桥甲人:/Jdon2002/4/23/(转软谙保解)H式实上书,Java好用K俄开发指南CommandBI式昆足让我杯取的一个税式,我在问读了许学代码后,才够觉隐Ia可取其也许原理,我认为理髀设计模式以主要足若双起原理构造,这样才对自己实与筠程有指等作用mand模火事实上不是个双具体,规定评多的模式,正是这个敏It性,让人有些confuse.Command定义n将般自客户端的恳求传入一个对象,无需了解这个号求激活的动作或有关接殳这个思求的处理询微环忙这是种两台机啬之间通讯收系性质的模式,类似传统过程沿J的CaUBaCk功健.优点,解耦了发送者利接受者之间联系,发送老词用一个操作,接受并接受魅求执行相应的动作,因为运IIICommand模式解箱,发送若无需知道接受各任何接口.不少Command模式的代犯都是舒对图形界面的,它实际找是菜华吩咐,我们在个下拉菜单选择一个吩咐时,然后会执行些动作.将这些吩咐豺装成花个类中,然后用户(调同不)再对这个类进行操作,这就足Command模式,换句话说,岸来用户(说用名)是f脆谓用这些吩咐的,如菜小I:打开文档(诩用狗,就干脆揄句打开文档的代码,运用Command楔式,就足在这两者之间埴加一个中间行,构这种卜脆关系坳断,同时两片之间都S离,葩本没有关系了.明显这样救的好处是符合川装的特性低端合状,Command是将对行为进行N装的典型模式,Factory是将创建送行封装的模式,从Command依式,我也发'以计模式个"通病:好象喜爱将向洁的问题困难化,喜爱在不同类中增加第三者,当博这样做有利于代码的健壮性可储护性还有史用性.如何延用?具体的ComrTWnd模式代码各a各样,因为如何封装场附,不同系统,行不同的政法下面米例是将功咐对装在一个Collection的USt中,任何对象一旦加入1.ist中,事实上装入了一个封闭的摞自中,对象的特性消逝了,只有取IH时,才有可能模制的辨别出:典型的COmmand校式须要有一个接口,接口中彳1.个统一的方法,达就足将吩咐/8.求封装为财象publicInterfaceCommandpublicabstractvoidexecute();具体不同吩咐/3求代码是实现接口Command,下面不泠具体吩咐publicclassEngineerimplementsCommandpublicvoide×ecute()(/doEngineercommand>publicclassProgrammerImplementsCommandpublicvoide×ecute()(/doprogrammer'sCOEmond>publicclassPolitiaanImplementsCommandpublicvoide×ecute()(/doPolitician'scommand根相通常做法,我们就可以f脆闻H这三个Command,位是运用Command模式,我们安格也们的装起来,扔到黑盒子IJSt里去:publicclassproducer(publicstatic1.istproduceRequests()1.istqueue=newArray1.ist();qucuc.add(newDomcsbcngi11ccr();queue.add(newPobtKJanQ);queue.add(newProgrammer();returnqueue;这:个吩咐进入1.iSt中后,己锐失去了其外表特征,以后再取出,也可傥无法落别出谛:是EngineeriftProgrammer了,行下面客户刑如何调用CommandHJ:publicclassTestCommandpublicstaticvoidmai(Stringargs)1.istqueue-Produccr.prodccRcqucsts();for(iteratorIt-queue.Iterator();t.hasNe×t();)客户病干竟利用execute方法,无需知退被调用杆的其£;更多类的力注多.(GH11mand)it.ne×t(),excte();>由此可见,调用者珞本只和接Il打交道,不合只体实现交互,这也体现了一个原则,而对接口编程,这样,以后增加第四个具体吩咐时,就不必修改调用行TestCommand中的代码了.理籽了上面的代码的核心朦理,在送用中,就应当各人仃自己方法了,特殊是在加H分别调用名和J!伟吩咽上,有许多女现“江而的代码是运用“从1.iSt过一遍”的做法.这种做法只是为/演示.运用COmmand模式的个好理由还因为它健实现Und。功能.每个具体吩咐都可以记住它刚刚执行的动作,并且在须要时复原.CommandC式在界面设计中应用广泛JaVa的Swing中菜单吩咐都是运用Command模式,由于Java在界面设计的性能上还fj欠献,因此界而设计具体代码我们就不探讨,网络卜fji1多这样的示例.