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),对一系列数据进行提交操作。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 【超分辨率】RDN论文详解(Residual Dense Network for Image Restoration)

    【超分辨率】RDN论文详解(Residual Dense Network for Image Restoration)这是CVPR2018的一篇文章,提出了针对图像复原任务的CNN模型RDN(residualdensenetwork)。RDN主要是提出了网络结构RDB(residualdenseblocks),它本质上就是残差网络结构与密集网络结构的结合。1.残差网络(resnet)与密集网络(densenet)1.残差网络结构残差网络结构:在输入与输出之间引入一个前向反馈的shor…

  • 操作系统中进程调度算法详解及例题解释「建议收藏」

    操作系统中进程调度算法详解及例题解释「建议收藏」文章目录1.先来先服务(FCFS,firstcomefirstserve)1.1算法思想1.2算法规则1.3用于作业/进程调度1.4是否可抢占1.5优缺点1.6是否会导致饥饿2.短作业优先(SJF,shortestjobfirst)2.1算法思想2.2算法规则2.3用于作业/进程调度2.4是否可抢占2.5优缺点2.6是否会导致饥饿3.高响应比优先(HRRN)…

  • Linux 文件系统与日志分析「建议收藏」

    Linux 文件系统与日志分析「建议收藏」文章目录1.前言2.深入理解Linux文件系统2.1inode与block详解(1)inode和block概述1.前言2.深入理解Linux文件系统2.1inode与block详解(1)inode和block概述  文件是存储在硬盘上的,硬盘的最小存储单位叫做“扇区”(sector),每个扇区存储512字节。一般连续八个扇区组成一个“块”(block),一个块是4K大小,是文件存取的最小单位。操作系统读取硬盘的时候,是一次性连续读取多个扇区

  • 谢惠民,恽自求,易法槐,钱定边编数学分析习题课讲义16.2.3练习题参考解答[来自陶哲轩小弟]…

    谢惠民,恽自求,易法槐,钱定边编数学分析习题课讲义16.2.3练习题参考解答[来自陶哲轩小弟]…

  • mac用鼠标滚轮滚动方向相反_macbook触控板怎么滚动

    mac用鼠标滚轮滚动方向相反_macbook触控板怎么滚动iPad用习惯了以后,在Mac上也喜欢把触控板的双指滑动滚动方向设成“自然”模式,但是鼠标滚轮的滚动方向也随之反过来了。估计很多苹果电脑用户和我一样希望触控板和鼠标滚动方向相反……你可以试

  • java 直播技术_视频直播的技术原理和实现思路方案整理

    java 直播技术_视频直播的技术原理和实现思路方案整理直播模型及其实现一个通用的直播模型一般包括三个模块:主播方、服务器端和播放端。首先是主播方,它是产生视频流的源头,由一系列流程组成:第一,通过一定的设备来采集数据;第二,将采集的这些视频进行一系列的处理,比如水印、美颜和特效滤镜等处理;第三,将处理后的结果视频编码压缩成可观看可传输的视频流;第四,分发推流,即将压缩后的视频流通过网络通道传输出去。其次是播放端,播放端功能有两个层面,第一个层面是关键…

发表回复

您的电子邮箱地址不会被公开。

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