我是设计模式的新手,我想更好地理解何时实现命令模式.根据我的理解,命令模式旨在将请求和满足该请求所需的逻辑封装到其自己的对象中.

为更复杂的请求创建命令是有意义的,比如生成和保存某个数据库结果的PDF报告.例如:

public class PdfExport implements Command {

    private MyEntityDao someDao = new MyEntityDaoImpl();

    public PdfExport( ... ) {
        // Set up command here...
    }

    @Override
    public void execute() {
        List<MyEntity> data = someDao.getData();
        // Complex logic to create and export PDF...
    }

}

但是,假设我们只有一个极其简单的任务,比如按名称字段删除单个记录.例如:

public class DeleteRecordByName implements Command {

    private MyEntityDao someDao = new MyEntityDaoImpl();
    
    String name;

    public DeleteRecordByName(String name) {
        this.name = name;
    }

    @Override
    public void execute() {
        someDao.deleteByName(name);
    }

}

如您所见,在第二个命令中实际上没有实现任何逻辑.我提出这样做的唯一原因是,您有一个分层的体系 struct ,并且希望将DAO排除在客户端代码之外,或者保留命令历史记录.

对于像删除单个记录这样简单的事情,创建命令有什么好处吗?

作为后续问题,在创建命令对象之前,是否需要涉及一定数量的逻辑?

推荐答案

是的,使用简单命令的原因很多. 戈夫的书从第235页开始列出了五个适用的要点.

在需要时使用命令模式

  1. 通过要执行的操作参数化对象.命令是回调的面向对象替代品.
  2. 在不同的时间指定、排队和执行请求.命令对象 可以拥有独立于原始请求的生存期.
  3. 支持undo撤消.命令的执行操作可以在命令本身中存储用于反转其效果的状态.
  4. 支持记录更改,以便在系统发生故障时可以重新应用这些更改 撞车.
  5. 围绕建立在原语操作之上的高级操作构建一个系统.这种 struct 在支持transactions的信息系统中很常见.

这本书增加了更多的细节;其中一些特性需要扩展Command接口,使其不仅仅是一个execute()方法;但在回答OP时,请注意这些特性都不涉及Command执行的任何特别复杂的逻辑.

Java中最典型的命令是RunnableCallable.考虑一下这些是如何通过简单甚至微不足道的逻辑实现的.

Java相关问答推荐

javafx getHostServices(). showDocument()调出Chrome而不是默认浏览器(Linux)

将偶数元素移动到数组的前面,同时保持相对顺序

替换com. sun. jndi. dns. DnsContextFactory Wildfly23 JDK 17

@org.springframework.beans.factory.annotation.Autowired(required=true)-注入点有以下注释:-SpringBoot

解析Javadoc时链接的全限定类名

无法在WebSocket onMessage中捕获错误

呈现文本和四舍五入矩形时出现的JavaFX窗格白色瑕疵

当返回Mono<;Something>;时,不会调用Mono<;void>;.flatMap

与不同顺序的组进行匹配,不重复组但分开

如何将Java文档配置为在指定的项目根目录中生成?

如何在JavaFX循环中完美地制作一个AudioClip/MediaPlayer?

使用正则表达式从字符串中提取多个值

错误:未找到扩展元素在JBossEAP 7.2中安装FUSE时出错

如何根据配置动态创建N个bean

Java中HashSet的搜索时间与TreeSet的搜索时间

JavaFX:为什么我的ComboBox添加了一个不必要的单元格的一部分?

为什么使用lo索引来解决二进制搜索问题不同于使用hi索引?

如何通过gradle命令行从build.gradle获得Java targetCompatibility

带有提取器的JavaFXObservableList会根据侦听器的存在而改变行为

为什么当我输入变量而不是直接输入字符串时,我的方法不起作用?