Java中多态结合命令模式的核心是通过Command接口统一行为,Invoker仅依赖接口调用execute(),由具体子类实现不同逻辑,实现运行时多态、解耦与动态扩展。

Java 中多态结合命令模式,核心在于用接口或抽象类统一命令行为,再靠具体子类实现不同请求逻辑。这样调用者(Invoker)只面向 Command 接口操作,完全不知道也不依赖哪个具体命令——这正是多态在起作用。
用 Command 接口定义统一入口
声明一个 Command 接口,只含 execute() 方法。所有具体命令都实现它,但各自内部调用不同的接收者(Receiver)方法。Invoker 持有 Command 引用,调用 execute() 时,JVM 自动根据实际对象类型执行对应实现——这就是运行时多态。
- 接口不暴露实现细节,调用者无需 import 具体命令类
- 新增命令只需新增 ConcreteCommand 子类,不改 Invoker 代码
- 可随时替换命令对象,比如测试时用 MockCommand,生产用 RealCommand
接收者解耦 + 多态委托
接收者(如 Light、FileSaver、Database)各自封装真实业务逻辑。每个具体命令持有一个接收者引用,在 execute() 中调用其特定方法。由于接收者之间无继承关系,命令类通过组合而非继承来复用它们,而多态体现在 Command 层面,不是 Receiver 层面。
- TurnOnLightCommand → 调用 light.turnOn()
- SaveDocumentCommand → 调用 saver.save()
- RollbackTransactionCommand → 调用 tx.rollback()
- Invoker 不关心这些差异,只管 call command.execute()
支持动态切换与批量分发
多态让命令可以被统一管理。比如把多个 Command 对象放进 List
立即学习“Java免费学习笔记(深入)”;
- 用户点击“撤销”按钮 → Invoker 执行 history.pop().undo()
- 后台任务队列 → ExecutorService 提交 Runnable 包装的 Command
- 宏命令(MacroCommand)→ 内部持有一组 Command,execute() 遍历执行,每一步仍是多态调用
撤销/重做也靠多态支撑
扩展 Command 接口,增加 undo() 方法。每个具体命令自行实现反向逻辑:TurnOnLightCommand.undo() 调用 light.turnOff(),SaveCommand.undo() 删除刚生成的文件。Invoker 同样只调用 undo(),多态确保执行的是该命令专属的回滚动作。
- 历史栈存的是 Command 对象,不是 if-else 分支
- 添加新可撤销命令,只需实现 execute() 和 undo(),不侵入原有控制流
- 多态让“执行什么”和“怎么撤回”都延迟到运行时决定


















