Command – 命令模式

Command – 命令模式

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

定义

将一个请求封装为一个对象,实现请求者与实施者的低耦合。

案例
大部分应用都存在非常多的菜单和一些操作button,但在设计这些菜单和button的时候,并不知道它要运行什么样的操作。在设计删除、复制和撤销这些详细实现的时候,也不知道在要什么地方用到,可能是代码里面直接调用,也可能是界面上点击了某个button后发生的操作。为了解决菜单和详细操作的这样的耦合度,就须要使用Command-命令模式:
Command - 命令模式

Command - 命令模式

菜单类的每个Item都保存一个Command子类的对象实例,当界面点击的时候,就调用Command的execute()方法,在Command子类的execute()方法里面会直接调用Receiver的action()方法,就运行详细的操作。
   
   
  1. class MenuItem {
  2. public:
  3. void setCommand(Command* comand) { m_command = command; }
  4. void onClicked() {
  5. m_command->execute();
  6. }
  7. private:
  8. Command* command;
  9. }
  10. class Command {
  11. public:
  12. virtual void execute();
  13. virtual bool isEnable();
  14. };
  15. class CopyCommand {
  16. public:
  17. virtual void execute() {
  18. m_receiver->action();
  19. }
  20. private:
  21. CopyReceiver* m_receiver;
  22. };
  23. class DeleteCommand {
  24. public:
  25. virtual void execute() {
  26. m_enable = m_receiver->action();
  27. }
  28. bool isEnable() {
  29. return m_enable;
  30. }
  31. private:
  32. DeleteReceiver* m_receiver;
  33. bool m_enable;
  34. };

一个Command对象还能够被不同的Invoker对象保存,用以实现相同的操作:
    
    
  1. MenuItem* copyItem = new MenuItem("Copy");
  2. MenuItem* deleteItem = new MenuItem("Delete");
  3. MenuItem* undoItem = new MenuItem("Undo");
  4. Button* copyButton = new Button("Copy");
  5. Button* deleteButton = new Button("Delete");
  6. Button* undoButton = new Button("Undo");
  7. Command* copyCommand = new CopyCommand();
  8. Command* deleteCommand = new DeleteCommand();
  9. Command* undoCommand = new UndoCommand();
  10. copyItem->setCommand(copyCommand);
  11. deleteItem->setCommand(deleteCommand);
  12. undoItem->setCommand(undoCommand);
  13. copyButton->setCommand(copyCommand);
  14. deleteButton->setCommand(deleteCommand);
  15. undoButton->setCommand(undoCommand);

Command - 命令模式

Command - 命令模式

同样的操作都使用同一个对象,当undoCommond的enable()返回false的时候,菜单和button都不能使用了。

适用性
  • 抽象出待运行的操作以參数化某对象,Command模式就像一个回调函数的对象实现。
  • 在不同的时刻指定、排列和运行请求,Commad有一个与初始请求无关的生存期。
  • 能够支持取消操作,在Command对象运行execute方法的之前把信息保存,提供一个unExecute方法恢复在运行前。也能够使用一个专门的Command来保存全部运行了的Commond对象比方UndoCommand来达到回滚操作。
  • 支持事物(Transaction),对一系列数据进行提交操作。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118161.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • redis常用指令

    redis常用指令

    2021年8月2日
    54
  • 2010年度 中国WEB应用防火墙厂家和产品大全

    2010年度 中国WEB应用防火墙厂家和产品大全中国WEB应用防火墙厂商与产品大全排名依据根据“厂家名称”的首字母拼音,无特殊含义。更新日期:2010年03月23日发布网站:www.cnciso.com、www.youxia.org联系人QQ:55984512、175589438厂家名称产品名称公司网址联系电话北京绿盟科技绿盟WEB应用防火墙www.nsfocus.com400-818-6868北京瑞达时代科技有限公…

    2022年6月2日
    38
  • 基于UDP编程_udp详解

    基于UDP编程_udp详解基于UDP编程1UDP是数据报协议,无连接的,不可靠,追求传输效率的一种通信协议数据的发送和接收是同步的.在进行通信之前,不需要建立连接.其传输效率比TCP高.对其服务器而言,并没有三次握手的过程.因此和TCP相比,少了被动监听(listen)和(accept).只需要创建通信设备,绑定IP地址和端口号.然后进行数据的收发.1.服务器端的编程模型创建一个socket端点,返回该端点的文件描述符fdsocket(2)2)将fd和本地地址绑定bind(2)while(1){3)阻塞等待

    2025年9月11日
    7
  • httprunner(5)编写测试用例

    httprunner(5)编写测试用例编写测试用例HttpRunnerv3.x支持三种测试用例格式pytest,YAML和JSON。官方强烈建议以pytest格式而不是以前的YAML/JSON格式编写和维护测试用例格式关系如下图所示

    2022年7月31日
    8
  • pki ca与数字证书技术大全_内部控制体系种类

    pki ca与数字证书技术大全_内部控制体系种类文章目录一、什么是PKIPKI基本组件数字证书分类二、参考一、什么是PKIPKI是PublicKeyInfrastructure的缩写,中文叫做公开密钥基础设施,也就是利用公开密钥机制建立起来的基础设施。PKI是PublicKeyInfrastructure的缩写,其主要功能是绑定证书持有者的身份和相关的密钥对(通过为公钥及相关的用户身份信息签发数字证书),为用户提供方便的证书申请、证书作废、证书获取、证书状态查询的途径,并利用数字证书及相关的各种服务(证书发布,黑名单发布,时间

    2022年8月22日
    11
  • Python中的三目表达式

    Python中的三目表达式Python中的三目表达式一般C系列语言,例如C#,三目运算都是“?:”的结构。例如:res=(i>j?true:false);但是在python中,使用的是if-else来实现的res=Trueifi>jelse2;#如果条件为真的话,那么结果为前者,否则为后者

    2025年7月15日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号