命令模式(Command Pattern)

上传人:l**** 文档编号:145335300 上传时间:2020-09-19 格式:DOC 页数:12 大小:242KB
返回 下载 相关 举报
命令模式(Command Pattern)_第1页
第1页 / 共12页
命令模式(Command Pattern)_第2页
第2页 / 共12页
命令模式(Command Pattern)_第3页
第3页 / 共12页
命令模式(Command Pattern)_第4页
第4页 / 共12页
命令模式(Command Pattern)_第5页
第5页 / 共12页
点击查看更多>>
资源描述

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

1、. . 描述:通常,面向对象应用程序是由一组能够提供有限的、专注于功能的相互交互的对象集合组成。为了响应用户的交互动作,应用程序执行一系列的处理。为了响应用户的请求,应用程序使用不同的对象提供的服务处理请求。根据实现,应用可以指定一个对象,这个指定的对象可以调用不同对象上的操作,被称为调用者(invoker)。(译者注:其实个人认为这个invoker在这里主动地成分更大,它是偏向于调用其他对象,这个区别就像英语employ这个动词是雇佣的意思,employee是员工?被雇佣的对象,而employer是雇主?雇佣的主动者,那么在这里的invoker是一个道理)。调用者(invoker)可以看作为

2、客户应用程序的一部分。那些包含提供处理请求服务实现的对象集合成为接受对象(ReceiverObject)。Figure30.1:ObjectInteraction?BeforeApplyingtheCommandPattern在这种设计中,发出请求的应用程序和提供处理请求服务的接受对象(ReceiverObject)集合之间彼此是紧密关联的,因为它们之间直接相互交互。这导致了在调用者(invoker)实现中会包含大量的if条件语句。 1. 2. if(RequestType=TypeA) 3. /dosomething 4. 5.6. if(RequestType=TypeB) 7. /dos

3、omething 8. 9. 当一种新的处理类型需要加入的应用时,现存的代码需要进行修改?这违背了面向对象开放?关闭的基本原则。1. 2. if(RequestType=TypeA) 3. /dosomething 4. 5. 6. if(RequestType=NewType) 7. /dosomething 8. 9. 使用命令模式,代表客户发布请求的调用者(invoker)和服务的处理者?接受对象(ReceiverObject)之间不具有耦合性。命令模式推荐创建一个可以为响应客户请求而执行处理或者采取动作的抽象。指定这个抽象声明一个被其它不同的具体的实现者所实现的共同接口,这些具体的实现

4、者称之为命令对象(CommandObjects)。每一个命令对象(CommandObject)代表一种不同的客户请求和对其进行的相应处理。在图30.2中,command接口代表了这个抽象。它声明一个excute方法,它由两个具体的实现者(类)?ConcreteCommand_1和ConcreteCommand_2。Figure30.2:CommandObjectHierarchy一个给定的命令对象(commandObject)负责提供处理它所代表的请求的功能,但是命令对象并不包含此功能的真实实现,它是通过使用接受对象(ReceiverObject)来提供处理功能。(如图30.3)Figure3

5、0.3:ClassAssociation?AftertheCommandPatternIsApplied当客户应用程序响应用户(或者其他应用)的交互而需要提供服务时:(1)客户创建需要的接受对象(ReceiverObject)。(2)客户创建一个相应的命令对象(CommandObject),并用在步骤1中创建的接受对象(ReceiverObject)配置这个命令对象。(3)客户创建一个调用者的实例(invoker),并用在步骤2中创建的命令对象(CommandObject)配置调用者。(4)调用者调用命令对象(CommandObject)上的execute方法。(5)作为execute方法实现

6、的一部分,特定的命令对象(CommandObject)调用它所包含的接受对象上的必要方法来提供需要的服务。在新的设计中:(1)客户/调用者(invoker)不直接与接受对象(Receiver)进行交互,它们之间完全不耦合。(2)当应用程序需要提供新的类型的时候,可以增加一个新的命令(Command)对象。这不需要修改调用者(invoker)的代码。因此新的设计保证了面向对象的开放?封闭的原则。(3)因为一个请求被指定为对象的形式,那么就存在以下可能性:1)把命令对象保存到持久介质上。以后进行执行。应用反向处理,实现恢复特性。2)把不同的命令对象分组成一个独立的单元。以下是一个FTP(FileT

7、ransferProtocol)客户事例应用程序,对于在实际应用程序中如何应用命令模式提供了很好的参考。 例子1:让我们建立一个应用程序来模拟FTP客户端的工作。在Java中,简单的FTP客户用户接口可以使用如下组件设计。(1)两个JList对象用于本地和远程文件系统的显示。(2)四个JButton对象用于初始不同的请求类型:上传、下载、删除和退出。用户接口组件摆列在一个frame中,如图30.4Figure30.4:SimpleFTPClientUIDisplay每一个JButton对象创建的时候,实现了ActionListener接口的Button-Handler类的一个事例是一个Acti

8、onListener的集合。1. publicclassFTPGUIextendsJFrame 2. 3. 4. /Createbuttons 5. btnUpload=newJButton(FTPGUI.UPLOAD); 6. btnUpload.setMnemonic(KeyEvent.VK_U); 7. 8. 9. ButtonHandlervf=newButtonHandler(); 10. btnUpload.addActionListener(vf); 11. btnDownload.addActionListener(vf); 12. btnDelete.addActionLis

9、tener(vf); 13. btnExit.addActionListener(vf); 14. 15. 16. /endofclass 因为这个相同的ButtonHandler实例是所有JButton对象的Action-Listener的一个集合,actionPerformed方法被所有的JButton对象调用。因此,ButtonHandler对象必须检测哪一个按钮被按下,并执行相应的处理。从Listing30.1中可以看到,actionPerformed方法的代码因为条件语句很不规则。当有很多按钮和菜单对象需要添加到FTP用户界面时,actionPerformed方法的代码就很混乱。同时

10、,一个新的按钮对象被添加时,现在的actionPerformed方法的代码必须修改。这违反了面向对象的开放?关闭原则。Listing30.1:ButtonHandlerClass1. classButtonHandlerimplementsActionListener 2. publicvoidactionPerformed(ActionEvente) 3. /ifstatements-fordifferenttypesofclientrequests 4. if(e.getActionCommand().equals(FTPGUI.EXIT) 5. System.exit(1); 6. 7.

11、 if(e.getActionCommand().equals(FTPGUI.UPLOAD) 8. intindex=localList.getSelectedIndex(); 9. StringselectedItem= 10. localList.getSelectedValue().toString(); 11. (DefaultListModel)localList.getModel().remove( 12. index); 13. (DefaultListModel)remoteList.getModel(). 14. addElement(selectedItem); 15. 1

12、6. if(e.getActionCommand().equals(FTPGUI.DOWNLOAD) 17. intindex=remoteList.getSelectedIndex(); 18. StringselectedItem= 19. remoteList.getSelectedValue().toString(); 20. (DefaultListModel)remoteList.getModel().remove( 21. index); 22. (DefaultListModel)localList.getModel(). 23. addElement(selectedItem

13、); 24. 25. if(e.getActionCommand().equals(FTPGUI.DELETE) 26. intindex=localList.getSelectedIndex(); 27. if(index=0) 28. (DefaultListModel)localList.getModel(). 29. remove(index); 30. 31. index=remoteList.getSelectedIndex(); 32. if(index=0) 33. (DefaultListModel)remoteList.getModel(). 34. remove(index); 35. 36. 37. 38. 让我们使用命令模式重新设计这个应用。应用命令模式,我们把不同按钮对象相关联的功能抽象一个Command-face接口。1. interfaceCommandInterface 2. publicvoidprocessEvent(); 3. 不同的按钮对象可以实现这个接口,独自成为自己的命令对象。但是,这是不推荐的,因为:(1)JBu

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

当前位置:首页 > 办公文档 > 工作范文

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