首页 > 其他分享 >命令模式

命令模式

时间:2023-04-01 11:34:40浏览次数:36  
标签:void 模式 命令 文档 receiver Document public

概述

《设计模式》一书中对于 “命令模式” 的意图描述如下:

将一个请求封装成为一个对象,从而可以使用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作

一般 “命令模式” 的 UML 图如下所示:

command_pattern.png

一般会在以下几种情况下使用命令模式:

  • 需要抽象出待执行的动作以参数化某对象
  • 在不同的时刻指定、排列和执行请求

具体示例

对于一个图形编辑器的界面来讲,对每个按钮或者菜单的点击都需要向当前编辑的文档对象发送一个请求,以完成相关的特殊操作,如:打开、保存、撤销、粘贴等。这一类请求的接受着为文档对象,但是文档对象并不能明确地知道会收到何种请求,同时,对于每个操作按钮或菜单项来讲,它们不能显式地实现相关的功能,因为它们不知道它们本身应该在何处被调用(即不知道所处得到上下文)

为了解决这个问题,我们可以考虑使用命令模式来进行处理,对于每个按钮的操作,我们都将它封装成为一个 “命令对象”,这样对于菜单项来讲就不需要知道当前的上下文,同时能够更加通用地将请求发送给对应的接受者

首先,定义文档对象的相关接口 Document

public interface Document {
    void copyContent(long start, long end); // 复制文档的部分内容
}

我们的编辑器可能需要支持普通文本文档和图形文档的编辑,因此我们需要定义对应的子类型:

// 普通文本文档类型
public interface TextDocument extends Document {}

// 图片类型文档
public interface ImageDocument extends Document {}

定义我们的编辑器的命令接受者对象 Receiver

public interface Receciver {
    void action();
    void createDocument(); // 从输入流中读取并构造并替换当前文档对象
}

定义操作命令的统一接口 Command

public interface Command {
    void execute();
}

针对打开文档和复制文档内容的具体命令 OpenDocumentCommandCopyContentCommand

public class OpenDocumentCommand implements Command {
    private final Receiver receiver;
    
    public OpenDocumentCommand(Receiver receiver) {
        this.receiver = receiver;
    }
    
    @Override
    public void execute() {
        receiver.action();
        receiver.createDocument(readFile(selectFile()));
    }
}

public class CopyContentCommand implements Command {
    private final Receiver receiver;
    private final Document doc; // 复制的操作只能针对已经打开的文档
    
    public CopyContentCommand(Receiver receiver, Document doc) {
        this.receiver = receiver;
        this.doc = doc;
    }
    
    @Override
    public void execute() {
        receiver.action();
        doc.copyContent(locateMouseStart(), locateMouseEnd());
    }
}

当选择一个按钮点击时,只需要将其关联的命令发送给调用者(在这里是文件编辑器对象)即可,一打开文档的操作为例:

public class OpenCodumentMenuItem {
    
    public void onClick() {
        Receiver receiver = obtainReceiver();
        OpenDocumentCommand cmd = new OpenDocumentCommand(receiver);
        cmd.execute();
    }
}

这样实现可以支持后续的扩展,比如撤销、重做等功能,而不需要逐一地修改每个菜单项的具体实现

总结

一般对于组合的组件来讲,同样可以命令模式来解除某些不必要的耦合,比如将多个命令组合成一个大命令,同时结合 “组合模式” 来处理多个组件之间的协调关系



参考:

[1] 《设计模式—可复用面向对象基础》

标签:void,模式,命令,文档,receiver,Document,public
From: https://www.cnblogs.com/FatalFlower/p/17278308.html

相关文章

  • 常用的DOS命令
    1.常用的DOS命令1.1怎么打开DOS命令窗口win+r键输入cmd1.2DOS命令是什么?最初的windows没图形界面1.3mkdirabc(创建一个abc目录)makedirectory(创建目录)1.4相对路径和绝对路径相对路径不带盘符:cdcourse绝对路径带盘符:   注意: cd..回到上级路径 ......
  • 装饰设计模式-java
      packagecn.shuishandt.opp;publicclassDecorateTest2{publicstaticvoidmain(String[]args){ Coffecoffe=newCoffe(); System.out.println(coffe.cost()+"=============>"+coffe.info()); Milkmilk=newMilk(coffe);......
  • Linux:常用命令有哪些?
    查看文件查看文件属性:file 文件名查看内容全部内容:cat-n(可选,显示行号)文件名分页查看:less文件名文件尾部:tail文件名头部:head文件名新建文件夹mkdir......
  • Redhat/CentOS Linux 系统进入单用户模式
    Redhat/CentOSLinux系统进入单用户模式以CentOS7.9和Redhat8.2为例进行操作,因为CentOS是Redhat的发行版,所以同版本号界面和操作是一样的。CentOS7.9 开机在grub引导界面时,按下e键进入编辑模式: 找到linux16这一行,在行末添加rd.break(注意这里是一整行),使用Ct......
  • 项目一众筹网07_01_SpringSecurity框架简介和用法、SpringSecurity负责的是 权限验证
    项目一众筹网07_01_SpringSecurity文章目录项目一众筹网07_01_SpringSecurity01简介SpringSecurity负责的是权限验证02-SpringSecurity简介03-Spring的注解模式maven引入Spring环境04-准备测试环境05-加入SpringSecurity环境06-实验1-放行首页和静态资源(下一篇)01简介现在主流的权......
  • 插件模式 bug优化2
    目前客户的现象很经典,某一个核cpu打满了!网卡开启了RSS,每个work都绑定了一个cpu。使用strace分析的时候,发现使用总是某一个线程被唤醒,然后这个work一直都在处理io事件。--这个问题原因就是惊群导致。详细就不写了,具体看内核就可知。主要是应用层的问题:由于代码比较老,里面很多......
  • 4.2.1 Redis相关命令详解及原理
    LinuxC/C++服务器Redis相关命令详解及原理Redis是RemoteDictionaryService的简称;也是远程字典服务;Redis是内存数据库,KV数据库,数据结构数据库;Redis应用非常广泛,如Twitter、暴雪娱乐、Github、StackOverflow、腾讯、阿里巴巴、京东、华为、新浪微博等,很多中小型公司......
  • linux常用命令总结
    1、文本类catcat-ntextfile1>textfile2#把textfile1的文档内容加上行号后输入textfile2这个文档里cat-btextfile1textfile2>>textfile3#把textfile1和textfile2的文档内容加上行号(空白行不加)之后将内容附加到textfile3文档里cat/dev/null>/etc/te......
  • mark一些常用的linux 命令
    /etc配置文件/bootlinux启动相关文件/bin命令/proc系统映射/srv系统/sys系统/tmp缓存/dev设备管理器/media比如u盘设备/mnt/opt一般安装文件放这里约定俗成/usr/local/安装额外的软件安装的目录/var比如日志可变的/selinux需要启动相当于360保证安......
  • 有度即时通统一工作门户助力政企单位开启数字化办公新模式
    为了提高办公效率,许多政企内部都会采用数套以上的办公系统平台,但这些平台相互之间都是独立的,形成了信息孤岛。政企内部人员在使用的时候需要来回切换,很容易出现信息遗漏和处理不及时的情况,阻碍了政企内部办公效率的提升。因此,不少政企迫切需要一款能够整合内部已有系统的的数字化......