抽象类在命令模式中定义execute执行规范,核心是声明统一接口、不实现具体逻辑、强制子类覆盖;必须含public abstract void execute();方法,可选undo();receiver通过构造函数传入具体命令类,抽象类仅持引用不硬编码类型,不管理状态与执行记录。

抽象类在命令模式中定义 execute 执行规范,核心是**声明统一接口、不实现具体逻辑、强制子类覆盖**。它不是用来干活的,而是给所有命令划一条“必须能执行”的底线。
Command 抽象类必须包含 execute() 方法
这是命令模式的契约起点。只要继承这个抽象类,就必须提供自己的执行逻辑:
- 方法签名通常为
public abstract void execute();,无返回值、无参数(或按需带上下文参数) - 不能有方法体,否则就不是“强制实现”,起不到约束作用
- 可同时定义
undo()(撤销),但非必需;是否支持撤销,由业务决定
接收者(Receiver)一般不直接写在抽象类里
抽象类本身不关心谁来干活,只管“能不能干”。实际执行依赖具体命令对 Receiver 的引用:
- 常见做法是在具体命令类(如
SaveCommand)构造时传入 Receiver 实例 - 抽象类可预留 protected 字段(如
protected Receiver receiver;),供子类复用初始化逻辑 - 不建议在抽象类里硬编码 Receiver 类型,否则破坏解耦——命令不该预设谁来执行
避免在抽象类中做状态管理或执行记录
执行历史、命令队列、撤销栈这些属于调用者(Invoker)或客户端职责:
- 抽象类只定义“做什么”,不定义“做了几次”或“谁调的”
- 像
List<command></command>或执行计数器,应放在 Invoker 或 Client 中维护 - 若需保存执行前状态(用于 undo),应在具体命令类内部处理,比如在
execute()开头备份数据
一个简洁实用的定义示例
这是生产环境中常见的写法,兼顾清晰性与扩展性:
abstract class Command {
// 可选:统一持有 receiver,便于子类使用
protected final Receiver receiver;
protected Command(Receiver receiver) {
this.receiver = receiver;
}
public abstract void execute();
// 撤销方法可选,按需实现
public abstract void undo();
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











