2024.11.24命令模式

命令模式(Command Pattern)是一种行为型设计模式,它将请求或简单操作封装为一个对象。这种模式提供了一种方法来参数化其他对象,将操作延迟到适当的时候执行,并支持撤销操作。命令模式通常用于以下场景:

  1. 需要将操作封装为对象:当需要将操作作为参数传递给其他对象时。
  2. 需要支持撤销和重做:当需要记录操作历史以支持撤销和重做功能时。
  3. 需要解耦请求的发送者和接收者:当需要降低系统组件之间的耦合度时。

命令模式的主要组件包括:

  1. Command(命令接口):定义命令的接口,声明执行操作的方法。
  2. ConcreteCommand(具体命令):实现Command接口,定义接收者和要执行的操作。
  3. Client(客户):创建具体的命令对象,并设置其接收者。
  4. Invoker(调用者):要求命令对象执行请求。
  5. Receiver(接收者):知道如何实施与执行一个请求相关的操作。

下面是一个简单的命令模式的代码示例:

// 命令接口 public interface Command { void execute(); } // 具体命令 public class Light { public void turnOn() { System.out.println("Light is on"); } public void turnOff() { System.out.println("Light is off"); } } public class LightOnCommand implements Command { private Light light; public LightOnCommand(Light light) { this.light = light; } public void execute() { light.turnOn(); } } public class LightOffCommand implements Command { private Light light; public LightOffCommand(Light light) { this.light = light; } public void execute() { light.turnOff(); } } // 调用者 public class RemoteControl { private Command command; public void setCommand(Command command) { this.command = command; } public void pressButton() { command.execute(); } } // 客户端代码 public class Client { public static void main(String[] args) { Light light = new Light(); RemoteControl control = new RemoteControl(); Command lightOn = new LightOnCommand(light); Command lightOff = new LightOffCommand(light); control.setCommand(lightOn); control.pressButton(); // Light is on control.setCommand(lightOff); control.pressButton(); // Light is off } }

在这个例子中,Command 是命令接口,LightOnCommandLightOffCommand 是具体命令,它们分别封装了打开和关闭灯的操作。Light 是接收者,它知道如何实施操作。RemoteControl 是调用者,它通过设置不同的命令来执行不同的操作。Client 是客户端代码,它创建具体的命令对象,并设置调用者。

命令模式的主要优点是它将发起操作的对象(调用者)和执行操作的对象(接收者)解耦,并且可以灵活地新增命令对象,使得系统更加灵活和可扩展。


__EOF__

本文作者258333
本文链接https://www.cnblogs.com/258-333/p/18566578.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   258333  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示