java设计模式(十五)命令模式(Command Pattern)

1、模式介绍:

命令模式(Command Pattern)是一种行为设计模式,其主要目的是将请求封装成一个对象,从而允许使用不同的请求、队列或者日志来参数化其他对象。这种模式使得命令的请求者和实现者解耦。

2、应用场景:

需要将请求发送者和接收者解耦:命令模式将请求封装成对象,使得发送者和接收者彼此独立,发送者不需要知道接收者的具体操作。
需要在不同的时间指定请求、排队请求、记录请求:命令模式允许将操作请求封装成对象,从而使得可以参数化其他对象来执行不同的请求、将请求排队、记录日志等。

3、优点:

降低系统耦合度:命令模式将请求者与接收者解耦,请求者无需知道接收者的详细信息。
新增或修改命令更加灵活:可以新增命令类或修改命令参数,而不影响到其他类。
支持撤销和重做操作:通过保存历史命令可以实现撤销和重做操作。

4、缺点:

命令类可能会增加系统复杂度:每一个命令都需要设计一个具体命令类,可能会导致类的数量增加。
可能会导致系统产生大量的具体命令类:如果命令操作很多,可能会产生大量的具体命令类。

5、代码示例:

/*** 命令接口** @author FM_南风* @date 2024/7/5*/
public interface Command {void execute();
}/*** 接收者类 - 灯** @author FM_南风* @date 2024/7/5*/
public class Light {public void turnOn() {System.out.println("灯已打开");}public void turnOff() {System.out.println("灯已关闭");}
}/*** 具体命令类 - 关灯命令** @author FM_南风* @date 2024/7/5*/
public class LightOffCommand implements Command {private Light light;public LightOffCommand(Light light) {this.light = light;}public void execute() {light.turnOff();}
}/*** 具体命令类 - 开灯命令** @author FM_南风* @date 2024/7/5*/
public class LightOnCommand implements Command{private Light light;public LightOnCommand(Light light) {this.light = light;}public void execute() {light.turnOn();}
}/*** 调用者类 - 遥控器** @author FM_南风* @date 2024/7/5*/
public class RemoteControl {private Command command;public void setCommand(Command command) {this.command = command;}public void pressButton() {command.execute();}
}/*** 应用** @author FM_南风* @date 2024/7/5*/
public class CommandClient {public static void main(String[] args) {// 创建灯对象Light light = new Light();// 创建具体命令对象Command turnOnCommand = new LightOnCommand(light);Command turnOffCommand = new LightOffCommand(light);// 创建遥控器对象RemoteControl remoteControl = new RemoteControl();// 设置命令并执行remoteControl.setCommand(turnOnCommand);remoteControl.pressButton(); // 打开灯remoteControl.setCommand(turnOffCommand);remoteControl.pressButton(); // 关闭灯}
}

6、结果展示:

7、示例说明:

在这个示例中:
Command 是命令接口,定义了执行命令的方法 execute
LightOnCommand 和 LightOffCommand 是具体的命令类,分别用于开灯和关灯操作。
Light 是接收者类,定义了实际的操作方法。
RemoteControl 是调用者类,通过 setCommand 方法设置命令,通过 pressButton 方法执行命令。

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

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

相关文章

【ARM】MDK-服务器与客户端不同网段内出现卡顿问题

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 记录不同网段之间的请求发送情况以及MDK网络版license文件内设置的影响。 2、 问题场景 客户使用很久的MDK网络版,在获取授权时都会出现4-7秒的卡顿,无法对keil进行任何操作,彻底…

Java 中如何实现接口和抽象类,它们的主要区别是什么?

在Java编程中,接口(Interface)和抽象类(Abstract Class)是实现抽象化的两种重要手段,它们帮助我们设计更灵活、可扩展的代码结构。 下面,我将从定义、实现方式、主要区别以及应用场景等方面&am…

力扣第七题——整数反转

题目介绍 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。 假设环境不允许存储 64 位整数(有符号或无符号)。 示例 1&#xff1…

ChatGPT Mac App 发布!

2024 年 6 月,OpenAI 的大语言模型 ChatGPT 的 Mac 客户端与 ChatGPT-4o 一起发布了。ChatGPT Mac 户端可以让用户直接在 Mac 电脑上使用 ChatGPT 进行对话。它提供了一个简单易用的用户界面,用户可以在其中输入文本或语音指令,并接收模型生成…

心跳检测的艺术:Eureka服务发现中的智能配置

心跳检测的艺术:Eureka服务发现中的智能配置 在微服务架构中,服务发现是确保服务之间可以相互通信的关键机制。Eureka作为Netflix开源的服务发现框架,提供了一种简单而高效的服务注册与发现机制。然而,为了维持服务的可用性和稳定…

python基础知识点(蓝桥杯python科目个人复习计划68)

做一下算法赛题目。 第一题:银色情人节 题目描述: 七月的阳光炙热灿烂,智慧的火花闪耀天际。7.14银色情人节,是传递爱意的美好时光。 分享甜蜜,珍藏浪漫。正是彼此的真心相伴,才有了我们温馨美满的情感。…

vue检测页面手指滑动距离,执行回调函数,使用混入的语法,多个组件都可以使用

mixin.ts 定义滑动距离的变量和检测触摸开始的方法&#xff0c;滑动方法&#xff0c;并导出两个方法 sendTranslateX.value > 250 && sendTranslateY.value < -100是向上滑动&#xff0c;满足距离后执行回调函数func&#xff0c;并在一秒内不再触发&#xff0c;一…

【重走编程路】设计模式概述(七) -- 外观模式、组合模式、享元模式

文章目录 前言10. 外观模式&#xff08;Facade&#xff09;定义解决方案为什么使用外观模式应用场景优缺点 11. 组合模式&#xff08;Composite&#xff09;定义解决方案应用场景优缺点 12. 享元模式&#xff08;Flyweight&#xff09;定义解决方案应用场景优缺点 前言 结构型…

【Python百日进阶-Web开发-音频】Day702 - librosa安装及模块一览表

文章目录 一、Librosa简介与安装1.1 Librosa是什么1.2 Librosa官网 二、Librosa安装2.1 安装Librosa 三、安装ffmpeg3.1 ffmpeg官网下载3.2 ffmpeg安装3.2.1 解压3.2.2 添加环境变量3.2.3 测试ffmpeg是否安装成功 四、Librosa 库模块一览4.1 库函数结构4.2 Audio processing&am…

C++相关概念和易错语法(21)(虚函数、协变、析构函数的重写)

多态的核心是虚函数&#xff0c;本文从虚函数出发&#xff0c;根据原理慢慢推进得到结论&#xff0c;进而理解多态 1.虚函数 先看一下下面的代码&#xff0c;想想什么导致了这个结果 #include <iostream> using namespace std;class A { public:virtual void test(){co…

x264 编码过程中视频相关数据流转分析

介绍 x264编码器的编码过程是一个复杂且多阶段的流程,涉及多个步骤,每个步骤都对视频数据进行特定的处理。以下是x264编码过程的一般数据流和关键步骤的分析: 输入帧处理: 输入原始视频帧到编码器。帧可能首先被转换到内部颜色空间(如YUV420P)。分析与预处理: 进行宏块级…

元服务体验-服务发现

服务发现&#xff0c;无论线上或线下的方式都可以发现元服务。 线上&#xff1a;基于用户意图。从精准意图的搜索、用户事件触发的推荐到主动探索等场景。用户可以在设备的负一屏、全局搜索、应用市场、桌面等场景发现元服务。 线下&#xff1a;用户在 HarmonyOS Connect标签…

华为HCIP Datacom H12-821 卷39

1.填空题 请2001 :0DB8:0000:C030:0000: 000: 09A0:CDEF地址进行压缩。() (若答案中存在字母&#xff0c;请采用大写格式) 参考答案&#xff1a;2001 :DB8:0:C030: :9A0:CDEF 解析&#xff1a; IPv6地址的表示方法 IPv6地址总长度为128比特&#xff0c;通常分为8组&#xff0c…

LeetCode 20.有效的括号 C写法

LeetCode 20.有效的括号 C写法 思路&#x1f9d0;&#xff1a; ​ 这题最优思路是用栈来进行匹配&#xff0c;如果是左括号就入栈&#xff0c;如果是右括号那么左括号就出栈去匹配&#xff0c;匹配成功就继续入栈或者出栈&#xff0c;匹配失败则字符串无效。不过C语言没有STL…

win10远程ubuntu服务器桌面且显示图像窗口工具及配置说明

仅需一个MobaXterm_Personal工具就可以实现 网上的教程比较多&#xff0c;实现起来比较复杂&#xff0c;这个是经过自己的钻研找到的方法&#xff08;请勿转载和抄袭&#xff09; 报错&#xff1a;cannot connect to X server :0.0 操作1&#xff1a;export DISPLAY自己windo…

python 语法学习(总结类) day 3

一、数据类型 1 整数类型 int 2 浮点数类型 float 3 复数类型 二、字符串类型 1 字符串类型 2 字节串类型&#xff08;很少用到&#xff09; 三、组合类型 1 集合类型&#xff1a;一维数组的集合 2 元组…

PHP基础认知

PHP&#xff08;Hypertext Preprocessor&#xff0c;即“超文本预处理器”&#xff09;是一种广泛使用的开源通用脚本语言&#xff0c;特别适合用于Web开发。其基础语法涵盖了多个方面&#xff0c;包括标记与注释、数据类型、变量、运算符、控制结构等。以下是PHP基础语法的详细…

【网络安全】资产记录工具 Hacker Asset Logger 安装使用详细教程

原创文章,不得转载。 文章目录 工具介绍安装地址使用方式工具介绍 在对某一应用程序的多个页面、对多个相关联的应用程序进行渗透测试的过程中,多个请求包的参数、功能之间可能存在一定的联系。 例如,在A页面触发的请求包中,通过UID可获取CustomerID;在B页面触发的请求包…

SSE、Webworker 、webSocket、Http、Socket 服务器推送技术

Http协议 受浏览器的同源策略限制 HTTP 协议是一种无状态的、无连接&#xff08;短暂连接&#xff0c;客户端发送请求&#xff0c;服务器响应后即断开连接&#xff09;的、单向的应用层协议。 它采用了请求/响应模型。通信请求只能由客户端发起&#xff0c;服务端对请求做出应…

浅谈网络安全防守:从被动应对到主动管理的转变

浅谈网络安全防守&#xff1a;从被动应对到主动管理的转变 背景&#xff1a; 在当今的数字时代&#xff0c;网络安全已成为企业生存和发展的重要基石。然而&#xff0c;当企业的网络安全体系面临着诸如资产不清、互联网应用管理混乱、边界防火墙策略失效、长期未修复的漏洞、…