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

Java 设计模式之命令模式

文章目录

  • Java 设计模式之命令模式
    • 概述
    • UML
    • 代码实现
      • 简单实现
      • 复杂实现

Java 设计模式之命令模式

概述

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

UML

在这里插入图片描述

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

代码实现

简单实现

定义命令接口:

public interface Command {void execute();
}

定义具体命令类:

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

定义接收者类:

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

定义调用者类:

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 control = new RemoteControl();control.setCommand(lightOn);control.pressButton();control.setCommand(lightOff);control.pressButton();}
}

输出:

开灯
关灯

复杂实现

定义抽象命令类:

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

定义接收者类:

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

定义具体命令类:

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

定义调用者类:

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

使用:

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

输出:

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

相关文章:

Java 设计模式之命令模式

文章目录 Java 设计模式之命令模式概述UML代码实现简单实现复杂实现 Java 设计模式之命令模式 概述 命令模式(Command)&#xff1a;将一个请求封装为一个对象&#xff0c;从而使你可用不同的请求对客户进行参数化&#xff1b;对请求排队或记录请求日志&#xff0c;以及支持可…...

BT401双模音频蓝牙模块如何开启ble的透传,有什么注意事项

BT401音频蓝牙模块如何开启ble的透传&#xff1f; 首先BT401的蓝牙音频模块&#xff0c;分为两个版本&#xff0c;dac版本和iis数字音频版本 DAC版本&#xff1a;就是BT401蓝牙模块【9和10脚】直接输出模拟音频信号&#xff0c;也就是说&#xff0c;直接推动耳机可以听到声音 …...

利用二分法+布尔盲注、时间盲注进行sql注入

一、布尔盲注&#xff1a; import requestsdef binary_search_character(url, query, index, low32, high127):while low < high:mid (low high 1) // 2payload f"1 AND ASCII(SUBSTRING(({query}),{index},1)) > {mid} -- "res {"id": payloa…...

Vue 项目登录的基本流程

Vue 用户登录的基本流程包括以下6个步骤&#xff1a; 步骤&#xff1a; 1. 创建登录表单 在前端&#xff0c;首先要创建一个登录表单&#xff0c;用户输入账号&#xff08;用户名、邮箱、手机号等&#xff09;和密码。 示例&#xff1a;Login.vue <template><div…...

kubernetes源码分析 kubelet

简介 从官方的架构图中很容易就能找到 kubelet 执行 kubelet -h 看到 kubelet 的功能介绍&#xff1a; kubelet 是每个 Node 节点上都运行的主要“节点代理”。使用如下的一个向 apiserver 注册 Node 节点&#xff1a;主机的 hostname&#xff1b;覆盖 host 的参数&#xff1…...

Web3 开发者周刊 36 | 构建自主未来:Agent、可扩展性与赏金

欢迎来到 Web3 开发者周刊 36&#xff0c;这里汇聚了赋能您的 Web3 构建之旅的各种资源。本周我们将剖析基于Agent的系统&#xff0c;讨论来自 Vitalik 关于以太坊 L1 和 L2 的最新思考&#xff0c;并提供最新高价值Bounty消息。 开始Build吧&#xff01; ✅ One Trillion Age…...

零基础入门机器学习 -- 第十一章机器学习模型的评估与优化

如何判断你的模型到底行不行&#xff1f; 11.1 为什么需要评估模型&#xff1f; 场景设定&#xff1a;信用卡欺诈检测 想象你是ABC银行的风控经理&#xff0c;你每天的工作就是盯着上百万笔交易&#xff0c;防止客户的信用卡被盗刷。 你们银行新推出了一款机器学习模型&…...

菜鸟之路Day15一一IO流(一)

菜鸟之路Day15一一IO流&#xff08;一&#xff09; 作者&#xff1a;blue 时间&#xff1a;2025.2.8 文章目录 菜鸟之路Day15一一IO流&#xff08;一&#xff09;0.概述1.初识IO流1.1.什么是IO流&#xff1f;1.2.IO流的作用1.3.IO流的分类 2.IO流的体系结构3.字节输出流的基本…...

动手学Agent——Day2

文章目录 一、用 Llama-index 创建 Agent1. 测试模型2. 自定义一个接口类3. 使用 ReActAgent & FunctionTool 构建 Agent 二、数据库对话 Agent1. SQLite 数据库1.1 创建数据库 & 连接1.2 创建、插入、查询、更新、删除数据1.3 关闭连接建立数据库 2. ollama3. 配置对话…...

JSONObject,TreeUtil,EagelMap,BeanUtil使用

目录 JSONObject的使用 TreeUtil的使用 EagleMap使用 安装 application.yml配置 springboot导入依赖 配置信息 简单使用 如果想获取这个json字符串里面的distance的值 BeanUtil拷贝注意 JSONObject的使用 假如我现在要处理这样的json数据 可以直接使用JSONUtil.parseObj…...

Unity嵌入到Winform

Unity嵌入到Winform Winform工程&#x1f308;...

TCP/UDP协议与OSI七层模型的关系解析| HTTPS与HTTP安全性深度思考》

目录 OSI 7层模型每一层包含的协议&#xff1a; TCP和UDP协议&#xff1a; TCP (Transmission Control Protocol)&#xff1a; UDP (User Datagram Protocol)&#xff1a; 数据包流程图 TCP与UDP的区别&#xff1a; 传输层与应用层的关联 传输层和应用层的关联&#xf…...

《Zookeeper 分布式过程协同技术详解》读书笔记-2

目录 zk的一些内部原理和应用请求&#xff0c;事务和标识读写操作事务标识&#xff08;zxid&#xff09; 群首选举Zab协议&#xff08;ZooKeeper Atomic Broadcast protocol&#xff09;文件系统和监听通知机制分布式配置中心, 简单Demojava code 集群管理code 分布式锁 zk的一…...

缺陷检测之图片标注工具--labme

一、labelme简介 Labelme是开源的图像标注工具&#xff0c;常用做检测&#xff0c;分割和分类任务的图像标注。 它的功能很多&#xff0c;包括&#xff1a; 对图像进行多边形&#xff0c;矩形&#xff0c;圆形&#xff0c;多段线&#xff0c;线段&#xff0c;点形式的标注&a…...

机器学习_13 决策树知识总结

决策树是一种直观且强大的机器学习算法&#xff0c;广泛应用于分类和回归任务。它通过树状结构的决策规则来建模数据&#xff0c;易于理解和解释。今天&#xff0c;我们就来深入探讨决策树的原理、实现和应用。 一、决策树的基本概念 1.1 决策树的工作原理 决策树是一种基于…...

请解释一下Standford Alpaca格式、sharegpt数据格式-------deepseek问答记录

1 Standford Alpaca格式 json格式数据。Stanford Alpaca 格式是一种用于训练和评估自然语言处理&#xff08;NLP&#xff09;模型的数据格式&#xff0c;特别是在指令跟随任务中。它由斯坦福大学的研究团队开发&#xff0c;旨在帮助模型理解和执行自然语言指令。以下是该格式的…...

ubuntu 安装管理多版本python3 相关问题解决

背景&#xff1a;使用ubuntu 22.04 默认python 未3.10.编译一些模块的时候发现需要降级到python3.9.于是下载安装 下载&#xff1a; wget https://www.python.org/ftp/python/3.9.16/Python-3.9.16.tgz解压与编译 tar -xf Python-3.9.16.tgz cd Python-3.9.16 ./configure -…...

滑动窗口算法篇:连续子区间与子串问题

1.滑动窗口原理 那么一谈到子区间的问题&#xff0c;我们可能会想到我们可以用我们的前缀和来应用子区间问题&#xff0c;但是这里对于子区间乃至子串问题&#xff0c;我们也可以尝试往滑动窗口的思路方向去进行一个尝试&#xff0c;那么说那么半天&#xff0c;滑动窗口是什么…...

Python爬虫实战:股票分时数据抓取与存储 (1)

在金融数据分析中&#xff0c;股票分时数据是投资者和分析师的重要资源。它能够帮助我们了解股票在交易日内的价格波动情况&#xff0c;从而为交易决策提供依据。然而&#xff0c;获取这些数据往往需要借助专业的金融数据平台&#xff0c;其成本较高。幸运的是&#xff0c;通过…...

【设计模式】【行为型模式】访问者模式(Visitor)

&#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f44d; 欢迎点赞、收藏、关注&#xff0c;跟上我的更新节奏 &#x1f3b5; 当你的天空突…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

Visual Studio Code 扩展

Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后&#xff0c;命令 changeCase.commands 可预览转换效果 EmmyLua…...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…...