概述
命令模式(Command Pattern)是将请求封装成对象的一种设计模式,这允许用户以不同的请求参数化客户端,同时支持请求的排队、日志记录及命令的撤销和恢复功能。这种模式有助于降低系统的耦合度,提高灵活性和可维护性。
UML图解
主要优势
- 易于设计命令队列,实现任务的批量处理。
- 方便地将命令记录到日志中,便于审计和故障排查。
- 提供了请求处理的选择性,接收者可以选择是否执行请求。
- 简化了新命令的添加过程,不影响现有系统的其他部分。
- 实现了请求发起者与请求执行者的分离,降低了两者之间的耦合。
潜在局限
- 可能导致系统中出现大量的具体命令类,增加了系统的复杂性。
适用场景
- 当需要将请求的发送者与接收者解耦时,避免两者直接通信。
- 当需要在不同的时间点指定、排队和执行请求时。
- 当系统需要支持命令的撤销和恢复操作时。
- 当需要组合多个操作,实现宏命令时。
实例分析
假设我们有一个主机,用户按下开机按钮后,主机内部会执行一系列开机步骤。通过命令模式,我们可以将这些步骤封装成命令对象,由专门的组件负责执行这些命令。
Java代码示例
1 public class Main {
2 public static void main(String[] args) {
3 // 组装主机
4 IMainBoard mainBoard = new GigaMainBoard();
5 ICommand openCommand = new OpenCommand(mainBoard);
6 Box box = new Box();
7 box.setOpenCommand(openCommand);
8 // 执行开机命令
9 box.openButtonPressed();
10 }
11
12 /** 主板接口 */
13 public interface IMainBoard {
14 void open();
15 }
16
17 /** 技嘉主板 */
18 public static class GigaMainBoard implements IMainBoard {
19 @Override
20 public void open() {
21 System.out.println("技嘉主板当前正在开机");
22 System.out.println("接通电源");
23 System.out.println("设备检查");
24 System.out.println("装载系统");
25 System.out.println("机器开始运行起来");
26 System.out.println("已开机");
27 }
28 }
29
30 /** 命令接口 */
31 public interface ICommand {
32 void execute();
33 }
34
35 /** 主板开机命令 */
36 public static class OpenCommand implements ICommand {
37 private IMainBoard mainBoard;
38
39 public OpenCommand(IMainBoard mainBoard) {
40 this.mainBoard = mainBoard;
41 }
42
43 @Override
44 public void execute() {
45 mainBoard.open();
46 }
47 }
48
49 /** 机箱类 */
50 public static class Box {
51 private ICommand openCommand;
52
53 public void setOpenCommand(ICommand openCommand) {
54 this.openCommand = openCommand;
55 }
56
57 /** 按下开机按钮 */
58 public void openButtonPressed() {
59 openCommand.execute();
60 }
61 }
62}