Command(命令)模式.doc

上传人:sk****8 文档编号:4277017 上传时间:2019-10-11 格式:DOC 页数:8 大小:136.50KB
下载 相关 举报
Command(命令)模式.doc_第1页
第1页 / 共8页
Command(命令)模式.doc_第2页
第2页 / 共8页
Command(命令)模式.doc_第3页
第3页 / 共8页
Command(命令)模式.doc_第4页
第4页 / 共8页
Command(命令)模式.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

1、设计模式-Command(命令)模式GoF:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数华;对请求排队或记录请求日志,以及支持克撤销的操作。在网上查找Command模式的相关资料,大多都是关于用户界面的。可能和GOF的先入为主有关系。在GoF的书中,四位作者举了个文本编辑器的例子。Command模式通过将请求本身变成一个对象来使工具箱对象可向未指定的应用对象提出请求。这个对象可被存储并像其他对象一样被传递。记得以前在设计模式精解的读书笔记中学习了几条经验,其中一条是:注意封装变化点。在Command模式中就是对变化点的典型封装。在Command模式中有一个关键的抽象类,一般人

2、们命名为Command类。他定义了一个执行操作的接口。它有一个抽象的execute操作。具体的Command子类(继承自Command的具体类)将接收者(Receiver类)作为其一个事例变量,并实现execute操作,指定接收者采取的动作。而接收者有执行该请求所需要的具体信息。下面举个例子: 先定义关键的Command抽象类(这里也可以用接口):packageCommand;publicabstractclassCommand.protectedReceiverreceiver;publicCommand(Receiverreceiver).this.receiver=receiver;/e

3、ndCommand(.)abstractpublicvoidexecute();/endabstractclassCommand再继承一个具体类:packageCommand;publicclassConcreteCommandextendsCommand.publicConcreteCommand(Receiverreceiver).super(receiver);/endConcreteCommand(.)publicvoidexecute().receiver.action();/endexecute()/endclassConcreteCommand定义一个Receiver类:pack

4、ageCommand;publicclassReceiver.publicvoidaction().System.out.println(Receiver.Action();/endAction()/endclassReceiver定义一个Invoker类:packageCommand;classInvoker.privateCommandcommand;publicvoidsetCommand(Commandcommand)mand=command;/endsetCommand(.)publicvoidexecuteCommand().command.execute();/endexecut

5、eCommand()/endclassInvoker最后是调用:packageCommand;publicclassCommandPattern.Receiverrceiver=newReceiver();Commandcommand=newConcreteCommand(rceiver);Invokerinvoker=newInvoker();/*/*CreatesanewinstanceofCommandPattern*/publicCommandPattern()./endCommandPatternpublicvoidshowCommandPattern().invoker.setCo

6、mmand(command);invoker.executeCommand();/endshowCommandPattern()publicstaticvoidmain(Stringargs).System.out.println(-);System.out.println(TheCommandPattern!);CommandPatterncp=newCommandPattern();cp.showCommandPattern();System.out.println(-);/endmain(.)/endclassCommandPattern下面给出UML图,看一下他们之间的关系:关于Com

7、mand模式的知识在GoF的书里还介绍了好多,在我所做过的项目中一直也没有用到过Command模式所以在这里也就不多说了,详细的还是参考GOF的书吧。设计模式之Command板桥里人 http:/ 2002/4/23/(转载请保留)模式实战书籍Java实用系统开发指南Command模式是最让我疑惑的一个模式,我在阅读了很多代码后,才感觉隐约掌握其大概原理,我认为理解设计模式最主要是掌握起原理构造,这样才对自己实际编程有指导作用.Command模式实际上不是个很具体,规定很多的模式,正是这个灵活性,让人有些confuse.Command定义n 将来自客户端的请求传入一个对象,无需了解这个请求激活

8、的 动作或有关接受这个请求的处理细节。这是一种两台机器之间通讯联系性质的模式,类似传统过程语 言的 CallBack功能。 优点:解耦了发送者和接受者之间联系。 发送者调用一个操作,接受者接受请求执行相应的动作,因为使用Command模式解耦,发送者无需知道接受者任何接口。不少Command模式的代码都是针对图形界面的,它实际就是菜单命令,我们在一个下拉菜单选择一个命令时,然后会执行一些动作.将这些命令封装成在一个类中,然后用户(调用者)再对这个类进行操作,这就是Command模式,换句话说,本来用户(调用者)是直接调用这些命令的,如菜单上打开文档(调用者),就直接指向打开文档的代码,使用Co

9、mmand模式,就是在这两者之间增加一个中间者,将这种直接关系拗断,同时两者之间都隔离,基本没有关系了.显然这样做的好处是符合封装的特性,降低耦合度,Command是将对行为进行封装的典型模式,Factory是将创建进行封装的模式,从Command模式,我也发现设计模式一个通病:好象喜欢将简单的问题复杂化, 喜欢在不同类中增加第三者,当然这样做有利于代码的健壮性 可维护性 还有复用性.如何使用?具体的Command模式代码各式各样,因为如何封装命令,不同系统,有不同的做法.下面事例是将命令封装在一个Collection的List中,任何对象一旦加入List中,实际上装入了一个封闭的黑盒中,对象

10、的特性消失了,只有取出时,才有可能模糊的分辨出:典型的Command模式需要有一个接口.接口中有一个统一的方法,这就是将命令/请求封装为对象:public interface Command public abstract void execute ( );具体不同命令/请求代码是实现接口Command,下面有三个具体命令public class Engineer implements Command public void execute( ) /do Engineers command public class Programmer implements Command public vo

11、id execute( ) /do programmers commandpublic class Politician implements Command public void execute( ) /do Politicians command按照通常做法,我们就可以直接调用这三个Command,但是使用Command模式,我们要将他们封装起来,扔到黑盒子List里去:public class producerpublic static List produceRequests() List queue = new ArrayList();queue.add( new Domestic

12、Engineer() );queue.add( new Politician() );queue.add( new Programmer() );return queue; 这三个命令进入List中后,已经失去了其外表特征,以后再取出,也可能无法分辨出谁是Engineer 谁是Programmer了,看下面客户端如何调用Command模式:public class TestCommand public static void main(String args) List queue = Producer.produceRequests();for (Iterator it = queue.it

13、erator(); it.hasNext(); )/客户端直接调用execute方法,无需知道被调用者的其它更多类的方法名。(Command)it.next().execute(); 由此可见,调用者基本只和接口打交道,不合具体实现交互,这也体现了一个原则,面向接口编程,这样,以后增加第四个具体命令时,就不必修改调用者TestCommand中的代码了.理解了上面的代码的核心原理,在使用中,就应该各人有自己方法了,特别是在如何分离调用者和具体命令上,有很多实现方法,上面的代码是使用从List过一遍的做法.这种做法只是为了演示.使用Command模式的一个好理由还因为它能实现Undo功能.每个具体命令都可以记住它刚刚执行的动作,并且在需要时恢复.Command模式在界面设计中应用广泛.Java的Swing中菜单命令都是使用Command模式,由于Java在界面设计的性能上还有欠缺,因此界面设计具体代码我们就不讨论,网络上有很多这样的示例.参考:

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 重点行业资料库 > 自然科学

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。