当前位置: 首页 > news >正文

行为模式2.命令模式------灯的开关

行为型模式

  1. 模板方法模式(Template Method Pattern)
  2. 命令模式(Command Pattern)
  3. 迭代器模式(Iterator Pattern)
  4. 观察者模式(Observer Pattern)
  5. 中介者模式(Mediator Pattern)
  6. 备忘录模式(Memento Pattern)
  7. 解释器模式(Interpreter Pattern)
  8. 状态模式(State Pattern)
  9. 策略模式(Strategy Pattern)
  10. 职责链模式(Chain of Responsibility Pattern)
  11. 访问者模式(Visitor Pattern)

命令模式(Command Pattern) 是一种行为型设计模式,它将一个请求封装为一个对象,从而使你可以用不同的请求、队列或日志来参数化其他对象。命令模式让你能够将请求发送者与请求接收者解耦,发送者只关心发送命令,而不需要知道如何处理它们。命令模式非常适合用于需要将多个操作组合成一个单一操作、撤销操作等场景。

主要角色
  1. Command(命令接口):声明了执行操作的接口。
  2. ConcreteCommand(具体命令):实现了命令接口,并定义了与接收者的绑定关系。具体命令对象将请求传递给接收者。
  3. Receiver(接收者):知道如何实施与请求相关的操作。具体的操作由接收者完成。
  4. Invoker(调用者):负责调用命令对象执行请求。
  5. Client(客户端):创建命令对象并设置其接收者。
  6. Invoker(调用者):请求命令的执行。

+-----------+        +-------------------+        +------------+
|   Client  |------->|    Invoker         |------->|   Command  |
+-----------+        +-------------------+        +------------+
                        |                          |
                        v                          v
                  +-------------+           +-------------------+
                  | Receiver    |           | ConcreteCommand   |
                  +-------------+           +-------------------+
 

工作原理
  • 命令:创建一个命令对象,将请求转发到接收者对象。
  • 调用者:调用命令对象的 execute() 方法来触发命令的执行。
  • 接收者:接收请求并执行相关操作。

命令模式的优点

  • 解耦请求者与执行者:发送请求的对象(调用者)不需要知道请求是如何被执行的,只需要知道如何调用命令接口。
  • 灵活性高:可以将多个请求组合成一个命令,命令也可以进行撤销、重做等操作。
  • 扩展性好:增加新命令时,只需要扩展新的命令类,无需修改现有的代码,符合开闭原则。

Java 示例代码

假设我们有一个遥控器(Invoker),可以控制开关家里的灯(Receiver),而每个按钮的动作就是一个命令(Command)。

// Command接口:所有具体命令的共同接口
public interface Command {void execute();void undo();
}// Receiver:接收命令并执行相关操作
public class Light {public void turnOn() {System.out.println("Light is ON");}public void turnOff() {System.out.println("Light is OFF");}
}// ConcreteCommand:开灯命令
public class LightOnCommand implements Command {private Light light;  // 接收者public LightOnCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.turnOn();  // 执行接收者的动作}@Overridepublic void undo() {light.turnOff();  // 撤销操作}
}// ConcreteCommand:关灯命令
public class LightOffCommand implements Command {private Light light;public LightOffCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.turnOff();  // 执行接收者的动作}@Overridepublic void undo() {light.turnOn();  // 撤销操作}
}// Invoker:遥控器,调用命令
public class RemoteControl {private Command command;// 设置命令public void setCommand(Command command) {this.command = command;}// 执行命令public void pressButton() {command.execute();}// 撤销命令public void pressUndo() {command.undo();}
}public class CommandPatternDemo {public static void main(String[] args) {// 创建接收者Light light = new Light();// 创建具体命令Command lightOn = new LightOnCommand(light);Command lightOff = new LightOffCommand(light);// 创建遥控器(调用者)RemoteControl remote = new RemoteControl();// 使用遥控器控制开关灯remote.setCommand(lightOn);remote.pressButton();  // 输出:Light is ONremote.setCommand(lightOff);remote.pressButton();  // 输出:Light is OFF// 撤销操作remote.pressUndo();  // 输出:Light is ON}
}


http://www.mrgr.cn/news/82364.html

相关文章:

  • K8s集群平滑升级(Smooth Upgrade of K8S Cluster)
  • 已知n找最小正整数x使n*x为一个平方数
  • 10.装饰器
  • Ruby 中文编码
  • 使用高云小蜜蜂GW1N-2实现MIPI到LVDS(DVP)转换案例分享
  • STM32的LED点亮教程:使用HAL库与Proteus仿真
  • 【数据库系统概论】绪论--复习
  • STM32 拓展 电源控制
  • 实际开发中,常见pdf|word|excel等文件的预览和下载
  • 前言(1)
  • flink cdc oceanbase(binlog模式)
  • 二、AI知识(神经网络)
  • Speedtest 测试客户的上/下行带宽
  • 泊松融合调研
  • 机器学习 学习知识点
  • Spark-Streaming有状态计算
  • Qt之简易音视频播放器设计(十五)
  • JAVA-制作小游戏期末实训
  • 服务端错误的处理和web安全检测
  • 六年之约day5
  • 软件项目的灵魂拷问:“要做什么?”和“做成了什么?”
  • Win11电脑Cursor默认打开markdown文件,如何修改markdown文件默认打开方式为Typora?
  • 鸿蒙开发汇总
  • HarmonyNext 鸿蒙开发中,在H5 页面如何下载图片保存到媒体库。
  • 使用Diffusion Models进行图像超分辩重建
  • CodeBlocks编程-C语言学习总结