命令模式

1991/6/26 行为型

# 定义

命令模式(Command Pattern):是一种结构型设计模式,它将请求封装为一个对象,从而使我们可以用不同的请求对客户进行参数化。命令模式使得我们可以通过调用对象的方式请求一个操作,而不是通过构造函数进行请求,从而使得代码更加灵活。

命令模式的关键点如下:

  1. 定义一个接收者和一个处理者。
  2. 接收者执行操作的代码与处理者执行操作的代码相互独立。
  3. 客户端发送消息给处理者,接收者收到消息执行相应的操作。
  4. 处理者负责存储客户端请求的状态,并在必要时通知客户端。

使用命令模式的场景包括但不限于:

  1. 当需要定义一个请求的对象,但是不知道如何完成该请求,可以使用命令模式。
  2. 当需要定义一个接受者和多个提供者,可以使用命令模式来创建和解构这些提供者。
  3. 当需要定义一个事件监听者,并且需要在多个事件处理者之间切换,可以使用命令模式。
  4. 当需要定义一个状态的容器,并且需要在不改变状态的情况下对状态进行修改,可以使用命令模式。
  5. 当需要定义一个工厂,用于创建多个类似的对象,可以使用命令模式。

命令模式是一种解决单线程多任务问题的设计模式。通过使用命令模式,我们可以将任务的请求和处理结果进行解耦,使得我们可以更容易地修改和扩展代码。同时,命令模式也可以提高程序的可读性和可维护性,使得代码更加易于理解和维护。

# 示例

interface Command {
    void execute(String[] args);
}
 // 定义具体命令
class CreateFileCommand implements Command {
    public void execute(String[] args) {
        // 根据给定的名称和内容创建文件的代码
        System.out.println("创建文件 : " + String.join(", ", args));
    }
}
 class DeleteFileCommand implements Command {
    public void execute(String[] args) {
        // 根据给定的名称删除文件的代码
        System.out.println("删除文件 : "+String.join(",",args) );
    }
}
 // 定义命令执行者
class CommandExecutor {
    private Map<String, Command> commands = new HashMap<>();
     public CommandExecutor() {
        // 将具体命令与命令名称关联起来
        commands.put("create", new CreateFileCommand());
        commands.put("delete", new DeleteFileCommand());
    }
     public void executeCommand(String commandName, String[] args) {
        // 查找对应的命令并执行
        Command command = commands.get(commandName);
        if (command != null) {
            command.execute(args);
        } else {
            System.out.println("Unknown command: " + commandName);
        }
    }
}
 // 使用命令执行者执行命令
public class Main {
    public static void main(String[] args) {
        CommandExecutor executor = new CommandExecutor();
        executor.executeCommand("create", new String[]{"file.txt", "Hello World!"});
        executor.executeCommand("delete", new String[]{"file.txt"});
        executor.executeCommand("unknown", new String[]{});
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

执行输出

创建文件 : file.txt, Hello World!
删除文件 : file.txt
Unknown command: unknown
1
2
3