14、设计模式之命令模式(Command)

一、什么是命令模式
命令模式(Command Pattern)是一种行为型设计模式,又叫动作模式或事务模式。它将请求(命令)封装成对象,使得可以用不同的请求对客户端进行参数化,具体的请求可以在运行时更改、排队或记录,它讲发出者和接收者解耦(顺序:发出者–>命令–>接收者)
本质:封装请求

二、角色组成

抽象命令(Command):命令是一个抽象接口,定义了执行操作的统一方法。具体的命令类会实现这个接口,并提供执行相应操作的具体逻辑。
具体命令(Concrete Command):具体命令类实现了抽象命令,它拥有接收者对象,并通过调用接收者的功能来完成命令要执行的操作。
接收者(Receiver):执行实际命令的类,命令对象会调用接收者的方法来执行请求。
调用者(Invoker):持有命令对象,通常是多个,并通过访问命令对象来执行相关请求,他不直接访问接收者。

三、优缺点
优点:

解耦:命令模式可以将发送命令的对象和执行命令的对象解耦,使得两者可以独立变化。
可扩展性:可以方便地添加新的命令类和接收者类,而无需修改现有的代码结构。
容易实现撤销和重做功能:由于每个命令对象都封装了具体的操作,可以很容易地实现命令的撤销和重做功能。
支持操作的队列化和延迟执行:命令对象可以被组织成队列或堆栈,实现对操作的排队和延迟执行。
缺点:

增加了类和对象的数量:使用命令模式可能会增加一些新的类和对象,从而增加了代码的复杂性。
需要额外的开销:封装命令对象和操作会增加一些额外的开销,可能会稍微降低性能。
可能导致过多的具体命令类:如果系统的命令比较多,可能会导致需要创建很多具体的命令类,增加了代码维护的难度。
四、应用场景
4.1 生活场景
餐厅点餐:在一家餐厅中,服务员充当调用者,厨师充当接收者,菜品可以作为具体命令。当顾客想点菜时,服务员会将顾客的需求封装成一个命令对象,并传递给厨师。厨师根据命令对象中的信息来完成相应的烹饪工作。这样,顾客和厨师之间不需要直接沟通,而是通过命令对象来实现点餐和烹饪的解耦。
遥控器控制家电:拿电视遥控器举例,遥控器是调用者,电视是接收者。每个按键都可以看作是一个具体命令,例如音量加、音量减、切换频道等。当用户按下某个按键时,遥控器会发送相应的命令给电视,然后电视根据命令执行相应的操作,如增加音量、减小音量或切换频道。
4.2 java场景

Runnable接口:Java中的Runnable接口就是一个典型的命令模式的应用。Runnable接口封装了需要执行的任务,然后可以交给线程去执行。
Timer和TimerTask类:这两个类用于定时任务调度,TimerTask类封装了要执行的任务,然后由Timer类作为调用者执行这些任务。
Statement接口:在Java中与数据库交互时,SQL语句被封装成Statement对象,然后由数据库驱动程序执行相应的命令。

五、代码实现
下面以餐厅点餐为例,解释以下命令模式。在一家餐厅中,服务员充当调用者,厨师充当接收者,菜品可以作为具体命令。当顾客想点菜时,服务员会将顾客的需求封装成一个命令对象,并传递给厨师。厨师根据命令对象中的信息来完成相应的烹饪工作。

抽象命令:Command
具体命令:OrderCommand
接收者:Chef
调用者:Waiter

5.0 UML类图
在这里插入图片描述
5.1 抽象命令(Command)——Command
首先,创建一个命令接口(Command),它定义了点菜和取消点菜的方法

/**** 1.抽象命令(Command): 点菜和取消两个命令* 定义:命令是一个抽象接口,定义了执行操作的统一方法。*/
public interface Command {//点菜void order();//取消点菜void cancelOrder();
}

5.2 接收者(Receiver)——Chef
创建接收者类(Chef)实现具体的烹饪操作。

/*** * 2.接收者(Receiver):厨师* 定义:执行实际命令的类,命令对象会调用接收者的方法来执行请求。*/
public class Chef {public void cook() {System.out.println("厨师执行点菜命令:正在烹饪菜品...");}public void cancelCooking() {System.out.println("厨师执行取消命令:停止烹饪菜品!");}
}

5.3 具体命令(Concrete Command)——OrderCommand
创建具体命令类(如点菜命令)实现命令接口,并将点菜的请求和具体的烹饪者(厨师)关联起来

/*** * 3.具体命令(Concrete Command):点菜命令* 定义:具体命令类实现了抽象命令,它拥有接收者对象,并通过调用接收者的功能来完成命令要执行的操作。*/
public class OrderCommand implements Command{// 厨师private Chef chef;public OrderCommand(Chef chef) {this.chef = chef;}public void order() {//与具体的烹饪者(厨师)关联,执行点菜操作chef.cook();}public void cancelOrder() {//与具体的烹饪者(厨师)关联,执行取消点菜操作chef.cancelCooking();}
}

5.4 调用者(Invoker)——Waiter

最后,在服务员类中,创建调用者(服务员),接收命令(点菜命令),并执行相应的操作

/**** 4.调用者(Invoker):服务员* 定义:持有命令对象,通常是多个,并通过访问命令对象来执行相关请求,他不直接访问接收者。*/
public class Waiter {//命令对象private Command command;public void setCommand(Command command) {this.command = command;}public void takeOrder() {// 服务员接收到顾客的点菜请求System.out.println("服务员接收到顾客(客户端)点菜请求!");// 执行点菜操作command.order();}public void cancelOrder() {// 服务员收到顾客的取消点菜请求System.out.println("服务员接收到顾客(客户端)取消点菜请求!");// 执行取消点菜操作command.cancelOrder();}
}

5.5 testCommand

/*** * 命令模式测试类*/
@SpringBootTest
public class TestCommand {@Testvoid testCommand(){// 创建厨师(接收者)Chef chef = new Chef();// 创建点菜命令Command orderCommand = new OrderCommand(chef);// 创建服务员(调用者)Waiter waiter = new Waiter();// 设置命令waiter.setCommand(orderCommand);// 服务员接收到点菜请求waiter.takeOrder();// 服务员接收到取消点菜请求waiter.cancelOrder();}
}

在这里插入图片描述
六、总结
命令模式适用于需要将请求封装成对象,实现请求发出者和接收者之间的解耦,并支持撤销、队列化和延迟执行的场景。它虽然可以提高系统的可扩展性和灵活性,但是需要权衡额外的开销和复杂性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/275332.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Css基础——绘制三角形、鼠标样式、轮廓线、放拖拽文本域、vertical-align属性

1、三角形的绘制方法 当一个盒子的width和height都为0时 四个边框都有颜色时,可以显示出三角形来 当其中的三边都是透明(transparent)的时候,就可以看到一个小三角形 2、鼠标样式(cursor) 代码部分&#…

sqllab第七关通关笔记

知识点: 利用回显信息不同进行盲注爆破出敏感信息两种绕过方法 单引号闭合绕过;不加注释符 id 1 and 11 完全闭合原始语句的绕过;这题是采用了where id((输入)) id 1)) and 11 -- 首先判断注入类型 构造id1/0 正常回显,字符型注…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Toggle)

组件提供勾选框样式、状态按钮样式及开关样式。 说明: 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 仅当ToggleType为Button时可包含子组件。 接口 Toggle(options: { type: ToggleType, is…

Shell常用脚本:hadoop集群启动、停止、重启脚本

脚本内容以我搭建的hadoop集群为例,你们自用的时候自行根据你们的情况进行修改即可 hadoop-cluster-manager.sh #!/bin/bash # 1. 调用此脚本前,请使用ssh-keygen -t rsa、ssh-copy-id -f 目标机器这两个命令使得目标机器是免密登录的 # 2. ssh远程执行…

分布式搜索引擎elasticsearch(2)

1.DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1.DSL查询分类 Elasticsearch提供了基于JSON的DSL([Domain Specific Language](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html))来定义查…

(done) 使用 vscode 快速把 .ipynb 文件 转为 .py 文件

如图,先点红圈 随后点 Export 后续操作凭直觉 可以使用 vim 的匹配功能把那些难看的符号给删掉,比如 :%s/# \%\%.*$//g

浅谈人工智能

☕️各位观众老爷好,路过点个免费的赞再走呗!❤️❤️(*•̀ᴗ•́*)و 前言 随着2024年的到来,人工智能领域正迎来前所未有的变革和发展。随着计算能力的增强、大数据的积累以及机器学习算法的进步, AI的定义和本质 人工智能…

(黑马出品_高级篇_04)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

(黑马出品_高级篇_04)SpringCloudRabbitMQDockerRedis搜索分布式 微服务技术——可靠性消息服务 今日目标服务异步通信-高级篇1.消息可靠性1.1.生产者消息确认1.1.1.修改配置1.1.2.定义Return回调1.1.3.定义ConfirmCallbac…

【BUG 弹药库】二分模板的优化

文章目录 1. 为什么要优化二分算法?2. 如何去优化原来的二分模板?3. 案例分析 1. 为什么要优化二分算法? ① 平常学习的二分整数的算法模板边界的问题很容易出错,不知道什么时候用 l mid,r mid - 1;或者是…

Vue:内置组件:KeepAlive(缓存组件实例)

一、作用 <KeepAlive></KeepAlive>能缓存包裹的所有组件&#xff0c;保证组件在切换时维持组件状态。 默认情况下&#xff0c;一个组件实例在被替换掉后会被销毁。这会导致它丢失其中所有已变化的状态——当这个组件再一次被显示时&#xff0c;会创建一个只带有初…

机器视觉系统选型-相机选型

分辨率&#xff1a;通过视野大小和精度需求来确定 相机分辨率 eg&#xff1a;视野(工件10mm8mm允许2mm的浮动)&#xff1a;12mm10mm&#xff0c;检测精度需求为0.01mm则理论需求的相机分辨率为&#xff1a;12mm/0.01mm1200以及10mm/0.01mm1000此时选择一个分辨率略大于1200*100…

StarRocks实战——云览科技存算分离实践

目录 背景 一、平台现状&痛点 1.1 使用组件多&#xff0c;维护成本高 1.2 链路冗长&#xff0c;数据时效性难以保证 1.3 服务稳定性不足 二、StarRocks 存算分离调研 2.1 性能对比 2.2 易用性 2.3 存储成本 三、StarRocks 存算分离实践 3.1 查询优化 3.1.1 物化…

云计算 3月13号 (OSI 七层模型:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层)

走进网络 1.认识计算机 1.计算机网络是由计算机和通讯构成的&#xff0c;网络研究的是“通信”。 ------1946 世界上第一台计算机 2.终端&#xff1a;只有输入和输出功能&#xff0c;没有计算和处理功能。 3.数据&#xff1a;一串数字&#xff08;二进制数&#xff09;&#…

数据结构:6、栈

一、栈的概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈&#x…

今日AI:GPT-4.5意外曝光可能6月发布、UP主借AI识别情绪播放量186万、全球首个AI程序员诞生

欢迎来到【今日AI】栏目!这里是你每天探索人工智能世界的指南&#xff0c;每天我们为你呈现AI领域的热点内容&#xff0c;聚焦开发者&#xff0c;助你洞悉技术趋势、了解创新AI产品应用。 新鲜AI产品点击了解:AIbase - 智能匹配最适合您的AI产品和网站 &#x1f4e2;一分钟速…

CSS 背景

CSS 背景 背景颜色 背景颜色若不设置&#xff0c;默认为透明(transparent) background-color: 颜色;背景颜色半透明 background: rgba(0, 0, 0, 0.3)前三个参数设定颜色&#xff0c;最后一个参数&#xff08;例如上述例子中的0.3&#xff09;设定透明度。0&#xff5e;1: 0…

C语言strcmp函数讲解

strcmp函数介绍 在cplusplus官网上是这样介绍strcmp函数的 这里的意思是假如我们输入两个字符串一个是abcdef另一个也是abcdef他们两个字符的每个元素的ascii码值进行比较如果两个元素的ascii码值都相等就移动到下一个元素a与a进行比较b与b进行比较直到遇到\0为止&#xff0c…

论坛管理系统|基于Spring Boot+ Mysql+Java+B/S架构的论坛管理系统设计与实现(可运行源码+数据库+设计文档+部署说明+视频演示)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 目录 前台功能效果图 管理员功能登录前台功能效果图 用户功能模块 系统功能设计 数据库E-R图设计 l…

彩虹外链网盘界面UI美化版超级简洁好看

彩虹外链网盘界面UI美化版 彩虹外链网盘&#xff0c;是一款PHP网盘与外链分享程序&#xff0c;支持所有格式文件的上传&#xff0c;可以生成文件外链、图片外链、音乐视频外链&#xff0c;生成外链同时自动生成相应的UBB代码和HTML代码&#xff0c;还可支持文本、图片、音乐、…

Skywalking

1、简介 Skywalking是由国内开源爱好者吴晟开源并提交到Apache孵化器的开源项目&#xff0c; 2017年12月SkyWalking成为Apache国内首个个人孵化项目&#xff0c; 2019年4月17日SkyWalking从Apache基金会的孵化器毕业成为顶级项目&#xff0c; 目前SkyWalking支持Java、 .Net、 …