java命令模式核心是将“做什么”封装为对象,通过统一command接口、具体命令类绑定receiver、invoker调度执行、client组装关系,实现请求发起、封装、执行的彻底分离。

Java 中实现命令模式,核心是把“做什么”变成一个对象,让调用者(比如按钮、遥控器)不直接调用业务逻辑,而是交给这个对象去执行。它不是语法糖,而是一种职责划分方式——把请求的发起、封装、执行彻底分开。
定义统一的命令接口
所有命令都要遵守同一个契约,通常就是一个简单接口:
- 声明 execute() 方法,作为命令被执行的入口
- 可选地添加 undo() 方法,为撤销功能预留空间
- 接口不依赖任何具体类,保持高度抽象
例如:public interface Command { void execute(); }
创建具体命令类并绑定接收者
每个具体操作(如开灯、保存文件)都对应一个实现类:
- 持有对 Receiver 的引用(比如 Light、TextEditor 实例)
- 在 execute() 中调用接收者的实际方法(如 light.turnOn())
- 如果需要支持撤销,可在 execute 前保存状态,并在 undo 中恢复
关键点:命令类只负责“转发”,不包含业务规则;接收者完全 unaware(无感)自己被哪个命令调用。
设计调用者(Invoker)来触发命令
调用者是命令的“执行调度中心”,典型例子是遥控器或菜单栏:
- 持有一个或多个 Command 引用(可单个、数组、栈、队列)
- 提供统一触发方法(如 click()、run()),内部只调用 command.execute()
- 不关心命令背后做了什么,也不依赖任何 Receiver 或 ConcreteCommand
这种设计让调用逻辑稳定,新增命令无需修改 Invoker 代码。
客户端负责组装关系
真正把各角色串起来的是客户端(Client),它在系统初始化时完成装配:
- 创建接收者实例(如 new Light())
- 创建具体命令实例,并传入接收者(如 new LightOnCommand(light))
- 将命令注入调用者(如 remote.setCommand(onCommand))
这一步解耦了对象创建与使用,也为测试和替换提供了便利——比如用 MockReceiver 替换真实设备。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











