Java 设计模式之命令模式

ops/2025/2/23 6:19:36/

文章目录

Java 设计模式命令模式

概述

  • 命令模式(Command):将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
  • 敏捷开发原则告诉我们,不要为代码添加基于猜测的、实际不需要的功能。如果不清楚一个系统是否需要命令模式,一般就不要着急去实现它,事实上,在需要的时候通过重构实现这个模式并不困难,只有在真正需要如撤销/恢复操作等功能时,把原来的代码重构为命令模式才有意义。

UML

在这里插入图片描述

  • Command:命令接口,定义执行操作的通用接口。
  • ConcreteCommand:具体命令类,实现具体的命令操作,持有接受者对象。
  • Receiver:接收者累,实际执行操作的对象。
  • Invoker:调用者,触发命令的对象。

代码实现

简单实现

定义命令接口:

java">public interface Command {void execute();
}

定义具体命令类:

java">public class LightOffCommand implements Command {private Light light;public LightOffCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.turnOff();}
}
java">public class LightOnCommand implements Command {private Light light;public LightOnCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.turnOn();}
}

定义接收者类:

java">public class Light {public void turnOn() {System.out.println("开灯");}public void turnOff() {System.out.println("关灯");}
}

定义调用者类:

java">public class RemoteControl {private Command command;public void setCommand(Command command) {this.command = command;}public void pressButton() {command.execute();}
}

使用:

java">public class Client {public static void main(String[] args) {Light light = new Light();Command lightOn = new LightOnCommand(light);Command lightOff = new LightOffCommand(light);RemoteControl control = new RemoteControl();control.setCommand(lightOn);control.pressButton();control.setCommand(lightOff);control.pressButton();}
}

输出:

开灯
关灯

复杂实现

定义抽象命令类:

java">abstract class Command {protected RoastCook receiver;public Command(RoastCook receiver) {this.receiver = receiver;}abstract void execute();
}

定义接收者类:

java">public class RoastCook {public void bakeMeet() {System.out.println("烤肉");}public void bakeFish() {System.out.println("烤鱼");}
}

定义具体命令类:

java">public class RoastFishCommand extends Command {public RoastFishCommand(RoastCook receiver) {super(receiver);}@Overridevoid execute() {receiver.bakeFish();}
}
java">public class RoastMeatCommand extends Command {public RoastMeatCommand(RoastCook receiver) {super(receiver);}@Overridevoid execute() {receiver.bakeMeet();}
}

定义调用者类:

java">public class Waiter {private ArrayList<Command> orders = new ArrayList<>();private Command command;// 下单public void setOrder(Command command) {String className = command.getClass().getSimpleName();if (className.equals("RoastFishCommand")) {System.out.println("下单:" + "烤鱼");} else {System.out.println("下单:" + "烤肉");}orders.add(command);}// 取消订单public void cancelOrder(Command command) {String className = command.getClass().getSimpleName();if (className.equals("RoastFishCommand")) {System.out.println("取消:" + "烤鱼");} else {System.out.println("取消:" + "烤肉");}orders.remove(command);}// 通知public void notifyCommand() {for (Command command : orders) {command.execute();}}
}

使用:

java">public class Client {public static void main(String[] args) {RoastCook receiver = new RoastCook();Command roastMeatCommand = new RoastMeatCommand(receiver);Command roastFishCommand1 = new RoastFishCommand(receiver);Command roastFishCommand2 = new RoastFishCommand(receiver);Command roastFishCommand3 = new RoastFishCommand(receiver);Waiter waiter = new Waiter();waiter.setOrder(roastFishCommand1);waiter.setOrder(roastFishCommand2);waiter.setOrder(roastMeatCommand);waiter.setOrder(roastFishCommand3);waiter.cancelOrder(roastFishCommand2);waiter.notifyCommand();}
}

输出:

下单:烤鱼
下单:烤鱼
下单:烤肉
下单:烤鱼
取消:烤鱼
烤鱼
烤肉
烤鱼

http://www.ppmy.cn/ops/160700.html

相关文章

Infuse Pro for Mac v8.1 全能视频播放器 支持M、Intel芯片

Infuse Pro 是一款强大的 Mac 视频播放器。它可以一口通吃您所有的视频文件 - Infuse 将把您从繁琐的视频转换中解放出来&#xff0c;用极美的方式在您的 Mac 上观赏几乎所有视频的格式。Infuse 已适配 macOS 11 并添加更加强大的在线视频&#xff0c;Trakt 同步&#xff0c;Ai…

Mysql 服务器开放远程访问

在实际开发和项目部署过程中&#xff0c;我们常常需要从远程主机连接到 MySQL 服务器&#xff0c;进行数据库的管理和操作。 默认情况下&#xff0c;MySQL 服务器只允许本地&#xff08;即服务器本身&#xff09;进行访问&#xff0c;要实现远程访问&#xff0c;需要进行一系列…

STM32:迎接汽车与AI时代MCU新挑战

作为通用32位MCU市场最受关注的产品系列&#xff0c;意法半导体&#xff08;ST&#xff09;的STM32 MCU从2007年问世之后就迎来爆发式增长&#xff0c;成功占据通用32位MCU市占率领头羊的位置&#xff0c;并且不断引领着通用MCU技术与应用的新思维开拓。 本文引用地址&#xf…

《深度剖析:人工智能与元宇宙构建的底层技术框架》

在科技飞速发展的当下&#xff0c;人工智能与元宇宙成为了备受瞩目的前沿领域。它们不仅是科技进步的象征&#xff0c;更预示着未来社会和经济发展的新方向。而要深入理解这两大领域&#xff0c;关键在于掌握其构建的底层技术框架。 一、人工智能的底层技术核心 &#xff08;…

实验题目:SQL 数据更新、视图

一、实验环境 实验使用普通PC机一台&#xff0c;MySQL数据库版本8.0.36&#xff0c;使用Navicat Premium 16提供图形化界面。 二、实验内容 1、insert 语句使用方法 2、update 语句使用方法 3、delete 语句使用方法 4、掌握 truncate table 语句使用方法 5、掌握视图的创…

Thread协议官方技术文档和资源

一、官方文档来源 1. Thread Group官网 网址&#xff1a;https://www.threadgroup.org核心内容&#xff1a; 技术白皮书&#xff1a;协议架构、安全机制、网络拓扑等概述。认证规范&#xff1a;设备认证流程和兼容性要求。开发者资源&#xff1a;入门指南、用例文档&#xff…

微信小程序修改个人信息头像(uniapp开发)

HTML部分 <div class"user-img" click"editUserImg"><image style"height: 128rpx;width: 128rpx;border-radius: 999px;margin-right: 10px;":src"userInfo?.userImg" mode"scaleToFill" /></div> TS部…

如何保证bug在改完之后不会引起新bug

一、测试前&#xff1a;影响范围分析 代码关联分析&#xff1a;依据开发代码关联性检查获取改动信息&#xff0c;聚焦影响范围&#xff0c;明确代码改动影响的业务功能、是否涉及公共组件或接口&#xff0c;检查 Swagger 文档更新情况。若开发无法明确影响范围&#xff0c;在测…