抽象类在命令模式中替代接口,提供默认实现、共享状态和强制子类实现核心方法;可封装接收者引用、日志、校验等共性逻辑,使具体命令专注业务,支持宏命令扩展,提升复用性与开闭性。

抽象类在命令模式中常作为命令接口的替代方案,用于提供部分默认实现、共享状态或强制子类实现核心方法,同时避免接口无法定义字段和构造逻辑的限制。
用抽象类定义命令基类
相比 interface Command,抽象类可封装共用属性(如接收者引用、执行日志)和基础行为(如空执行、撤销前检查),让具体命令更专注业务逻辑。
- 定义
abstract class AbstractCommand,持有Receiver receiver字段和带参构造器 - 声明
abstract void execute()和abstract void undo(),强制子类实现核心动作 - 可添加默认方法:如
log(String msg)统一日志,或isExecutable()做前置校验
具体命令继承并定制行为
每个业务命令(如开灯、保存文件)继承抽象基类,只需实现抽象方法,复用父类状态与工具能力。
-
class LightOnCommand extends AbstractCommand在构造时传入Light接收者 -
execute()调用receiver.turnOn(),并调用log("Light turned on") -
undo()调用receiver.turnOff(),无需重复处理日志或空值判断
调用方与 Invoker 解耦接收者细节
Invoker(如遥控器)只依赖抽象命令,不关心具体类型或接收者实现,符合开闭原则。
- Invoker 持有
List<abstractcommand></abstractcommand>或单个AbstractCommand引用 - 调用
command.execute()时,多态自动分发到对应子类逻辑 - 新增命令(如
AlarmTriggerCommand)只需继承抽象类、实现两个方法,无需修改 Invoker
配合组合与宏命令扩展能力
抽象类还可支持宏命令(MacroCommand)——自身既是命令,又聚合其他命令,利用抽象基类统一管理生命周期。
-
class MacroCommand extends AbstractCommand内部持List<abstractcommand> commands</abstractcommand> -
execute()遍历调用每个子命令的execute() -
undo()倒序调用每个子命令的undo(),复用抽象类定义的契约 - 所有子命令(包括宏命令本身)都可被同一 Invoker 安全调用
抽象类不是命令模式必需,但在需要共享状态、构造逻辑或默认行为时,比纯接口更自然有力。关键在于把变化点(具体动作)留给子类,把稳定点(接收者管理、日志、校验)沉淀到抽象层。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











