深入理解命令模式:解耦调用与操作的Java设计模式实践

本文详细介绍了命令设计模式在Java中的应用,通过接口定义、具体实现和命令管理器的示例,展示了如何将操作与调用对象分离,实现请求的参数化、执行和队列管理。

Command-Shaaf’s Blog | 关于软件开发及相关经验的全部内容

切换导航

Shaaf的博客所有文章java文章会议存档工作坊关于搜索计算机 设计 设计模式 gof 操作指南 java 模式 编程 软件 软件开发 命令Command由 Shaaf的博客 发布 于 2008年10月31日,星期五

通过使用命令模式,您可以将操作与调用对象分离。正因如此,在不更改调用者的情况下更改命令变得更加容易。

这意味着在以下情况下您可以使用命令模式:

  • 您希望参数化对象以执行操作
  • 您希望在不同时间指定、执行和排队请求

为了快速开始,您需要一个命令对象。在这种情况下,接口将使其易于使用,从而为您提供扩展其他类(例如Swing MenuItem或Button)的选项。

下面的execute方法是在调用此命令或要求其执行操作时调用的方法。

而getCommandName被假定为一个唯一名称,但我相信我们总能想出更好的实现来确保唯一性。

1
2
3
4
public interface Command {
    public void execute();
    public String getCommandName();
}

命令的示例实现应如下所示: 一个命令名称,以及一个execute方法,用于说明调用此命令时会发生什么。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
public class ForwardCmd implements Command {

    private String COMMAND_NAME = "Back";

    public BackCmd() {
        super();
    }

    public String getCommandName() {
        return COMMAND_NAME;
    }

    public void execute() {
        System.out.println("Your wish, my command");
    }
}

在这种情况下,命令管理器是控制器。它注册命令对象。“registerCommand”将简单地获取一个命令并将其存储在列表或类似结构中。这意味着您可以从jar文件、xml或路径中加载它,并将对象作为命令传递给“registerCommand”。

“execute”命令将简单地执行传递给它的命令。

而“getCommand”通过查找COMMAND_NAME返回一个命令。因此,如果您通过系统向其提供一个名称,它应该返回一个Command类型的对象,并简单地将其传递给execute。同样,这将是控制器逻辑,而不是客户端逻辑。

1
2
3
4
5
6
7
public abstract class AbstractCommandManager {

    public abstract void registerCommand(Command command);
    public abstract Collection getAllCommands();
    public abstract void execute(Command command);
    public abstract Command getCommand(String name);
}

← 上一篇下一篇→目录特色标签管理员 ant 自动化 构建 缓存 ci 命令 计算机 持续 设计 设计模式 docker 工程 fedora gof 操作指南 howto ibm infinispan 集成 jacl java jdbc jdk-21 jython kubernetes llm 迁移 mq openjdk openshift 模式 编程 quarkus redhat 发布 rhel scm 脚本 单例 单例模式 软件 软件开发 svn 系统管理员 提示 工具 工具类 websphere wsadmin

版权所有 © Shaaf的博客 2025

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计