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

设计模式笔记_行为型_命令模式

1.命令模式介绍

命令模式(Command Pattern)是一种行为设计模式,它将请求或操作封装为对象,使得可以用不同的请求对客户端进行参数化。命令模式的核心思想是将方法调用、请求或操作封装到一个独立的命令对象,从而使得客户端与请求的接收者分离。

结构组成:命令模式通常包含以下几个组件:

  1. Command(命令)接口:定义执行操作的接口。
  2. ConcreteCommand(具体命令)类:实现命令接口并定义具体的操作。
  3. Receiver(接收者):实际执行命令的对象,具体实现操作。
  4. Invoker(调用者):持有一个命令对象,调用命令对象执行请求。

类比场景:想象一下,你家里有一个智能灯,你可以按下遥控器上的按钮来打开或关闭灯。

  • 这里遥控器就是Invoker,调用开关灯命令对象执行开关灯请求;
  • 遥控器的每个按钮相当于一个命令对象command,它负责执行具体的开关灯操作;
  • 智能灯就是Receiver,是实际执行开关命令的对象

优缺点分析

  • 优点
    • 解耦:将请求的发送者和接收者解耦,使得命令对象可以灵活地扩展和组合。
    • 可扩展性:可以很容易地添加新的命令,符合开放-关闭原则。
    • 支持撤销操作:可以通过在命令对象中实现撤销功能来支持操作的撤销和重做。
  • 缺点
    • 可能导致类膨胀:对于每个命令都需要定义一个具体命令类,可能会导致类数量增加。
    • 复杂性增加:引入了额外的抽象层,可能导致系统复杂性增加

2. 代码演示

演示场景:使用遥控器控制智能灯的开关。

Command(命令)接口: 定义执行操作的接口。

// Command接口
public interface Command {void execute();
}

ConcreteCommand(具体命令)类:实现命令接口并定义具体的操作。

// ConcreteCommand类:持有接收者对象Light,调用接收者来执行命令
public class LightOnCommand implements Command {private Light light;public LightOnCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.turnOn();}
}public class LightOffCommand implements Command {private Light light;public LightOffCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.turnOff();}
}

Receiver(接收者):实际执行命令的对象,具体实现操作。

// Receiver类
public class Light {public void turnOn() {System.out.println("The light is on");}public void turnOff() {System.out.println("The light is off");}
}

Invoker(调用者):持有命令对象,负责调用命令对象执行请求。

// Invoker类
public class RemoteControl {private Command command;public void setCommand(Command command) {this.command = command;}public void pressButton() {command.execute();}
}

客户端代码:

public class CommandClientDemo {public static void main(String[] args) {Light livingRoomLight = new Light();Command lightOn = new LightOnCommand(livingRoomLight);Command lightOff = new LightOffCommand(livingRoomLight);RemoteControl remote = new RemoteControl();remote.setCommand(lightOn);remote.pressButton(); // 输出: The light is onremote.setCommand(lightOff);remote.pressButton(); // 输出: The light is off}
}

对应的类图:

http://www.dtcms.com/a/339784.html

相关文章:

  • Pygame中,精灵Sprite与精灵组Group,显性入组与隐性入组,它们之间的关系是什么?
  • JB4-8-事务机制
  • 决策树学习总结
  • 在 IntelliJ IDEA 中修改 Git Commit 描述
  • Java秋招:高并发查询优化
  • 【学习】Linux 内核中的 cgroup freezer 子系统
  • 基于SpringBoot的高校心理教育辅导系统
  • 【python实用小脚本-190】Python一键删除PDF任意页:输入页码秒出干净文件——再也不用在线裁剪排队
  • Android Cordova 开发 - Cordova 嵌入 Android
  • 如何免费给视频加字幕
  • 【论文阅读】SIMBA: single-cell embedding along with features(1)
  • 当qtcpserver类对象释放时,该类下面的多个qtcpsocket连接会释放吗
  • 论文阅读系列(一)Qwen-Image Technical Report
  • IATF 16949认证是什么?
  • GaussianLSS
  • Java 并发同步工具类详解
  • WordPress 从删除文章后(清空回收站)保存被删除文章的链接到txt
  • 24.早期目标检测
  • Nacos-7--扩展一下:0-RTT和1-RTT怎么理解?
  • 【unitrix数间混合计算】3.2 非零标记trait(non_zero.rs)
  • JVM垃圾回收(GC)深度解析:原理、调优与问题排查
  • libvaapi,libva-utils源码获取并编译测试
  • 深入理解AQS:并发编程的基石
  • django生成迁移文件,执行生成到数据库
  • sfc_os!SfcValidateDLL函数分析之SfcGetValidationData
  • Android音频学习(十三)——音量配置文件分析
  • Python数据分析:DataFrame,reindex,重建索引。有时候整型变浮点型,有时候又不变?
  • FPGA 在情绪识别领域的护理应用(一)
  • 第二十六天:static、const、#define的用法和区别
  • Java:Assert与 Return