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

23种设计模式-行为型模式之命令模式(Java版本)

Java 命令模式(Command Pattern)详解

🧠 什么是命令模式?

命令模式是一种行为型设计模式,它将请求封装成一个对象,从而使你可以使用不同的请求、队列、日志请求以及支持可撤销的操作。

命令模式将请求的发送者和接收者解耦,调用者不再直接操作接收者对象,而是通过命令对象来实现。


🎯 使用场景

  • 需要将请求调用者与请求接收者解耦
  • 希望支持撤销、重做操作
  • 需要支持日志记录和事务处理等功能

🏗️ 模式结构

  • Command(命令接口):声明执行命令的接口,通常有一个 execute() 方法
  • ConcreteCommand(具体命令类):实现命令接口,定义具体的执行操作
  • Invoker(调用者):请求命令的对象,调用命令对象的 execute() 方法
  • Receiver(接收者):知道如何执行与请求相关的操作,实际执行命令的类

✅ 示例:遥控器控制灯光

命令接口

public interface Command {void execute();
}

具体命令类

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();}
}

接收者类

public class Light {public void turnOn() {System.out.println("Light is ON");}public void turnOff() {System.out.println("Light is OFF");}
}

调用者类

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();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}
}

✅ 优点

  • 请求发送者和接收者解耦
  • 可以灵活地增加或改变命令
  • 支持撤销和重做功能
  • 可以组合多个命令

⚠️ 缺点

  • 增加了类的数量,系统复杂度增加
  • 对于简单操作,命令模式的使用可能显得过于复杂

🧩 使用建议

命令模式适合那些需要将请求发起者与请求执行者解耦的场景,尤其是当你需要提供撤销、重做操作或将多个命令封装成一个组合命令时。

http://www.xdnf.cn/news/171181.html

相关文章:

  • 鸿蒙系统应用开发全栈指南
  • HarmonyOS Next~鸿蒙系统流畅性技术解析:预加载与原生架构的协同进化
  • 神经编译革命:如何用脑机接口直接编程量子计算机?
  • 用Function Calling让GPT查询数据库(含示例)
  • 【Git】初始Git及入门命令行
  • 03.使用spring-ai玩转MCP
  • IdeaVim 配置与使用指南
  • 【Part 2安卓原生360°VR播放器开发实战】第二节|基于等距圆柱投影方式实现全景视频渲染
  • 位置差在坐标系间的相互转换
  • C++类和对象(上)
  • Spark SQL开发实战:从IDEA环境搭建到UDF/UDAF自定义函数实现
  • 《TVM模式匹配实战:从DFPatternNode到DFPattern的高级用法》
  • OceanBase数据库-学习笔记2-C#/C++程序如何访问
  • C++如何使用调试器(如GDB、LLDB)进行程序调试保姆级教程(2万字长文)
  • 使用 Autofac 实现依赖注入
  • 嵌入式软件--stm32 DAY 4 中断系统
  • Linux日志处理命令多管道实战应用
  • Python爬虫实战:获取网yi云音乐飙升榜的歌曲数据并作分析,为歌单推荐做参考
  • Spark SQL核心概念与编程实战:从DataFrame到DataSet的结构化数据处理
  • 《一键式江湖:Docker Compose中间件部署108式》开篇:告别“配置地狱”,从此笑傲云原生武林!》
  • python+adafruit_pca9685 测试舵机存储当前角度
  • 知识体系_数据量纲化处理方式
  • PWN基础-利用格式化字符串漏洞泄露canary结合栈溢出getshell
  • 神经网络笔记 - 神经网络
  • 东田数码科技前端面经
  • 运算符分为哪几类?哪些运算符常用作判断?简述运算符的优先级
  • 电池的寿命
  • 参数规模:衡量大语言模型体量的标尺
  • 【Java面试笔记:进阶】23.请介绍类加载过程,什么是双亲委派模型?
  • NEPCON China 2025 | 具身智能时代来临,灵途科技助力人形机器人“感知升级”