command命令模式

上传人:sh****d 文档编号:108390324 上传时间:2019-10-23 格式:DOC 页数:7 大小:108.52KB
返回 下载 相关 举报
command命令模式_第1页
第1页 / 共7页
command命令模式_第2页
第2页 / 共7页
command命令模式_第3页
第3页 / 共7页
command命令模式_第4页
第4页 / 共7页
command命令模式_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《command命令模式》由会员分享,可在线阅读,更多相关《command命令模式(7页珍藏版)》请在金锄头文库上搜索。

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.iterator(); it.hasNext(); )/客户端直接调用execute方法,无需知道被调用者的其它更多类的方法名。(Command)it.next().execute(); 由此可见,调用者基本只和接口打交道,不合具体实现交互,这也体现了一个原则,面向接口编程,这样,以后增加第四个具体命令时,就不必修改调用者TestCommand中的代码了.理解了上面的代码的核心原理,在使用中,就应该各人有自己方法了,特别是在如何分离调用者和具体命令上,有很多实现方法,上面的代码是使用从List过一遍的做法.这种做法只是为了演示.使用Command模式的一个好理由还因为它

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号