跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Java命令模式
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= Java命令模式 = 命令模式(Command Pattern)是一种行为设计模式,它将请求或操作封装为一个对象,从而使你可以参数化客户端与不同的请求、队列或日志请求,并支持可撤销的操作。这种模式的主要目的是将“发出请求的对象”和“接收与执行这些请求的对象”解耦。 == 介绍 == 在软件开发中,命令模式用于将方法调用(即操作或请求)封装成对象。这使得这些操作可以被传递、存储、延迟执行或撤销。命令模式通常包含以下几个关键组件: * '''命令(Command)''':一个接口或抽象类,声明执行操作的方法(如`execute()`)。 * '''具体命令(ConcreteCommand)''':实现命令接口的具体类,通常包含接收者对象并调用接收者的方法来完成操作。 * '''接收者(Receiver)''':实际执行操作的对象,知道如何完成请求。 * '''调用者(Invoker)''':持有命令对象并触发命令的执行。 * '''客户端(Client)''':创建具体的命令对象并设置其接收者。 命令模式的核心思想是将“请求”本身作为一个对象,从而允许用户参数化其他对象,如队列、日志或撤销操作。 == 结构 == 以下是命令模式的类图表示: <mermaid> classDiagram class Command { <<interface>> +execute() } class ConcreteCommand { -receiver: Receiver +execute() } class Receiver { +action() } class Invoker { -command: Command +setCommand(Command) +executeCommand() } class Client { } Command <|-- ConcreteCommand ConcreteCommand o-- Receiver Invoker o-- Command Client ..> ConcreteCommand Client ..> Receiver </mermaid> == 代码示例 == 以下是一个简单的Java实现示例,展示如何使用命令模式控制电灯的开关: <syntaxhighlight lang="java"> // 命令接口 interface Command { void execute(); } // 接收者:电灯 class Light { public void turnOn() { System.out.println("Light is ON"); } public void turnOff() { System.out.println("Light is OFF"); } } // 具体命令:开灯 class TurnOnLightCommand implements Command { private Light light; public TurnOnLightCommand(Light light) { this.light = light; } @Override public void execute() { light.turnOn(); } } // 具体命令:关灯 class TurnOffLightCommand implements Command { private Light light; public TurnOffLightCommand(Light light) { this.light = light; } @Override public void execute() { light.turnOff(); } } // 调用者:遥控器 class RemoteControl { private Command command; public void setCommand(Command command) { this.command = command; } public void pressButton() { command.execute(); } } // 客户端代码 public class CommandPatternDemo { public static void main(String[] args) { Light light = new Light(); Command turnOn = new TurnOnLightCommand(light); Command turnOff = new TurnOffLightCommand(light); RemoteControl remote = new RemoteControl(); remote.setCommand(turnOn); remote.pressButton(); // 输出: Light is ON remote.setCommand(turnOff); remote.pressButton(); // 输出: Light is OFF } } </syntaxhighlight> === 输出 === <pre> Light is ON Light is OFF </pre> == 实际应用场景 == 命令模式在以下场景中非常有用: 1. '''GUI 按钮和菜单项''':在图形用户界面中,按钮或菜单项可以绑定到命令对象,从而在点击时执行特定操作。 2. '''事务管理''':数据库事务可以使用命令模式实现,支持回滚操作。 3. '''宏命令''':将多个命令组合成一个宏命令,一次性执行多个操作。 4. '''任务队列''':将命令对象存储在队列中,按顺序或延迟执行。 === 示例:宏命令 === 以下是一个宏命令的示例,它组合了多个命令: <syntaxhighlight lang="java"> class MacroCommand implements Command { private List<Command> commands = new ArrayList<>(); public void addCommand(Command command) { commands.add(command); } @Override public void execute() { for (Command command : commands) { command.execute(); } } } // 客户端代码 public class MacroCommandDemo { public static void main(String[] args) { Light light = new Light(); Command turnOn = new TurnOnLightCommand(light); Command turnOff = new TurnOffLightCommand(light); MacroCommand macro = new MacroCommand(); macro.addCommand(turnOn); macro.addCommand(turnOff); RemoteControl remote = new RemoteControl(); remote.setCommand(macro); remote.pressButton(); // 依次执行开灯和关灯 } } </syntaxhighlight> === 输出 === <pre> Light is ON Light is OFF </pre> == 优缺点 == === 优点 === * 解耦调用者和接收者,调用者无需知道接收者的具体实现。 * 支持撤销和重做操作(通过存储命令历史)。 * 支持组合命令(如宏命令)。 * 易于扩展新的命令,无需修改现有代码。 === 缺点 === * 可能导致类的数量增加,每个具体命令都需要一个单独的类。 * 在某些情况下,命令对象的生命周期管理可能变得复杂。 == 总结 == 命令模式是一种强大的设计模式,特别适用于需要将操作封装为对象并支持撤销、队列或日志的场景。通过将请求的发送者和接收者解耦,命令模式提高了代码的灵活性和可维护性。初学者可以通过简单的示例(如电灯控制)理解其核心思想,而高级用户可以利用它实现更复杂的系统(如事务管理或任务调度)。 [[Category:编程语言]] [[Category:Java]] [[Category:Java设计模式]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)