【设计模式】命令模式

其他系列文章导航

Java基础合集
数据结构与算法合集

设计模式合集

多线程合集

分布式合集

ES合集


文章目录

其他系列文章导航

文章目录

前言

一、什么是命令模式?

二、命令模式的优点和应用场景

三、命令模式的要素和实现

 3.1 命令

3.2 具体命令

3.3 接受者

3.4 调用者

3.5 客户端

四、总结


前言

欢迎来到【设计模式】系列博客,今天我们将探讨其中一种重要的设计模式——命令模式。

设计模式是软件开发中解决常见问题的最佳实践,而命令模式则是其中一种非常实用的设计模式,它可以帮助我们更好地组织和管理请求或命令。

在本篇博客中,我们将详细介绍命令模式的定义、特点、使用场景以及实现方式。通过具体的案例和实践,我们将深入了解命令模式在实际项目中的应用和优势。同时,我们还将分享一些注意事项和最佳实践,以帮助您更好地理解和应用命令模式。

希望通过本篇博客的学习,您能够掌握命令模式的基本概念和用法,并在实际项目中灵活运用这一设计模式,提高软件的质量和效率。


一、什么是命令模式?

命令模式是一种行为型设计模式,核心是将每种请求或操作封装为一个独立的对象,从而可以集中管理这些请求或操作,比如将请求队列化依次执行、或者对操作进行记录和撤销。

命令模式通过将请求的发送者(客户端)和接收者(执行请求的对象)解耦,提供了更大的灵活性和可维护性。


二、命令模式的优点和应用场景

命令模式最大的优点就是解耦请求发送者和接受者,让系统更加灵活、可扩展。

由于每个操作都是一个独立的命令类,所以我们需要新增命令操作时,不需要改动现有代码。

命令模式典型的应用场景:

  • 系统需要统一处理多种复杂的操作,比如操作排队、记录操作历史、撤销重做等。
  • 系统需要持续增加新的命令、或者要处理复杂的组合命令(子命令),使用命令模式可以实现解耦。


三、命令模式的要素和实现

 3.1 命令

相当于遥控器操作按钮的制作规范

命令是一个抽象类或接口,它定义了执行操作的方法,通常是execute,该方法封装了具体的操作。

public interface Command {void execute();
}

3.2 具体命令

相当于遥控器的某个操作按钮

具体命令是命令接口的具体实现类,它负责将请求传递给接收者(设备)并执行具体的操作。

比如定义一个关闭设备命令:

public class TurnOffCommand implements Command {private Device device;public TurnOffCommand(Device device) {this.device = device;}public void execute() {device.turnOff();}
}

还可以定义开启设备命令:

public class TurnOnCommand implements Command {private Device device;public TurnOnCommand(Device device) {this.device = device;}public void execute() {device.turnOn();}
}

3.3 接受者

相当于被遥控的设备

接收者是最终执行命令的对象,知道如何执行具体的操作。

比如定义一个设备类:

public class Device {private String name;public Device(String name) {this.name = name;}public void turnOn() {System.out.println(name + " 设备打开");}public void turnOff() {System.out.println(name + " 设备关闭");}
}

3.4 调用者

相当于遥控器

作用是接受客户端的命令并执行。

比如定义遥控器类:

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

以上只是最基础的调用者类,还可以给遥控器类增加更多能力,比如存储历史记录、撤销重做等。

3.5 客户端

相当于使用遥控器的人

客户端的作用是创建命令对象并将其与接收者关联(绑定设备),然后将命令对象传递给调用者(按遥控器),从而触发执行。

示例客户端:

public class Client {public static void main(String[] args) {// 创建接收者对象Device tv = new Device("TV");Device stereo = new Device("Stereo");// 创建具体命令对象,可以绑定不同设备TurnOnCommand turnOn = new TurnOnCommand(tv);TurnOffCommand turnOff = new TurnOffCommand(stereo);// 创建调用者RemoteControl remote = new RemoteControl();// 执行命令remote.setCommand(turnOn);remote.pressButton();remote.setCommand(turnOff);remote.pressButton();}
}

在这个示例中,命令模式将遥控器按钮的按下操作与实际设备的开关操作解耦,从而实现了灵活的控制和可扩展性。

整个程序的 UML 类图如下:

图片


四、总结

在软件开发中,我们经常需要处理各种请求或命令,这些请求或命令可能是来自用户、系统或其他组件。

如何有效地管理和处理这些请求或命令,对于提高软件的可维护性和可扩展性至关重要。命令模式可以帮助我们实现这一目标。

命令模式的主要思想是将请求或命令封装成一个对象,从而将发出请求的客户端与接收请求的服务端操作解耦。

这样,我们可以将请求或命令传递给服务端进行相应的处理,而不必直接依赖于服务端的具体实现。同时,通过将请求或命令封装成对象,我们可以更好地组织和管理这些请求或命令,提高代码的可读性和可维护性


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

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

相关文章

Github 2023-12-23 开源项目日报 Top10

根据Github Trendings的统计,今日(2023-12-23统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目6C项目2C项目1Jupyter Notebook项目1HTML项目1Go项目1非开发语言项目1 免费API集体清单 创建周期…

VGGNet

目录 一、VGGNet介绍 1、VGG块 2、VGG架构 3、LeNet, AlexNet和VGGNet对比 4、总结 二、代码实现 1、定义VGG卷积块 2、VGG网络 3、训练模型 4、总结 一、VGGNet介绍 VGGNet(Visual Geometry Group Network)是一种深度卷积神经网络,…

java String转asc码,然后ascII再转四位的16进制数。

理论知识补充: char是Java中的保留字,表示一种数据类型。与别的语言不同的是,char在Java中是16位的,因为Java用的是Unicode编码。不过8位的ASCII码包含在Unicode编码中,其值对应十进制的表示范围是0~127。 char是Java八…

《软件方法(下)》8.2.4 类和属性的命名

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 8.2 建模步骤C-1 识别类和属性 8.2.4 类和属性的命名 8.2.4.2 关于DDD话语中的“通用语言” DDD(领域驱动设计)话语中有“通用语言(Ubiquitous L…

2023-12-22 linux C语言pthread_kill函数,pthread_kill(tid, 0)可以用来判断线程是否存在

一、该函数其实不是kill线程,而是向线程发送一个signal,pthread_kill()函数的作用是向某个线程传递一个信号,创建的线程中signal(SIGKILL,sig_handler)函数去处理对应的信号,如果你给一个线程发送了SIGQUIT、SIGKILL,但…

Ubuntu20.04.2-mate上Lazarus安装与测试

简言 Lazarus采用RAD方式界面开发,一套代码可交差编译出windows、ios、android、solaris、BSD等 各平台运行的程序,在unbuntu的repo中有2.2.0版本可用,在sourceforge上有2.2.6版本和3.0.0的Rolling版可下载安装,但感觉上2.2.0和2…

跨境电商独立站深度分析演示网站

对于跨境电商卖家来说,多平台、多站点的布局是非常重要的战略。这样做可以规避”鸡蛋放在同一个篮子里”的风险也能够追求更高的销售额和利润。同时,市场的变化也带来了新的发展机会,因此很多出海企业都希望抓住独立站的新机遇,抢…

【优质】「web开发网页制作」html+css关于动漫主题海贼王网页制作(7页面附源码)

涉及知识 动漫主题网页制作,海贼王网站7页面,动漫divcss,动漫网站成品,CSSDIV布局,期末网页大作业,网页作业成品,web前端源码实例,如何制作网页,网页设计思路&#xff0…

SpringIOC之SimpleTimeZoneAwareLocaleContext

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…

IntelliJ IDEA 2020将SpringMVC项目打成war包

一 、打开 Project Structure 进行配置 1. 打开方式 (1)CtrlAltShiftS (2)File->Project Structure (3)点击如下图标: 2. 进入 Project Structure,添加Artifacts Web Applica…

后台留言列表

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>后台管理系统</title> <meta http-equiv"X-UA-Compatible" content"IEedge,chrome1"> <meta http-equiv"Acc…

解决xcode 运行不老iPhone 15 iOS 17.1 设备的问题

问题 最近要查看一下ios 17.1的设备的性能&#xff0c;但是当前版本的Xcode运行不了 解决方法 1、更新Xcode版本到15.1以上 2、更新完成后&#xff0c;大概率出现这个情况 原因&#xff1a;在app Store中更新到Xcode15后,运行不了模拟器和真机.需要下载iOS 17对应的模拟器.&…

Linux 一键部署二进制Gitea

gitea 前言 Gitea 是一个轻量级的 DevOps 平台软件。从开发计划到产品成型的整个软件生命周期,他都能够高效而轻松的帮助团队和开发者。包括 Git 托管、代码审查、团队协作、软件包注册和 CI/CD。它与 GitHub、Bitbucket 和 GitLab 等比较类似。 Gitea 最初是从 Gogs 分支而来…

python报错A value is trying to be set on a copy of a slice

加入.copy()即可避免该报错提示 原代码&#xff1a; df5df4.drop_duplicates() print(df5.shape)df5[班型中文名称]df5[班型名称]-A print(df5.head()) 输出结果&#xff1a; 修改后代码&#xff1a; df5df4.drop_duplicates().copy() print(df5.shape)df5[班型中文名称]df…

通过 Higress Wasm 插件 3 倍性能实现 Spring-cloud-gateway 功能

作者&#xff1a;韦鑫&#xff0c;Higress Committer&#xff0c;来自南京航空航天大学分布式系统实验室 导读&#xff1a;本文将和大家一同回顾 Spring Cloud Gateway 是如何满足 HTTP 请求/响应转换需求场景的&#xff0c;并为大家介绍在这种场景下使用 Higress 云原生网关的…

一个屌丝程序员的分享

目录 闲扯 关于chatgpt的看法 关于学习工作之外的事情 关于提升自我&#xff0c;避免内耗的事情 写在最后 闲扯 现在是2023.11.8日晚上10.37分&#xff0c;刚结束完今天的任务&#xff0c;今天过的很累&#xff0c;今年过的很快&#xff0c;今年基本过的也很不如意&#x…

eventbus,在this.$on监听事件时无法在获取数据

问题&#xff1a;vue中eventbus被多次触发&#xff0c;在this.$on监听事件时&#xff0c;内部的this发生改变导致&#xff0c;无法在vue实例中添加数据。 项目场景 一开始的需求是这样的&#xff0c;为了实现两个组件(A.vue ,B.vue)之间的数据传递。 页面A&#xff0c;点击页面…

sql_lab之sqli中的宽字节注入(less32)

宽字节注入&#xff08;less-32&#xff09; 1.判断注入类型 http://127.0.0.3/less-32/?id1 http://127.0.0.3/less-32/?id1 出现 \’ 则证明是宽字节注入 2.构成闭环 http://127.0.0.3/less-32/?id1%df -- s 显示登录成功则构成闭环 3.查询字段数 http://127.0.0.3/…

7. 结构型模式 - 代理模式

亦称&#xff1a; Proxy 意图 代理模式是一种结构型设计模式&#xff0c; 让你能够提供对象的替代品或其占位符。 代理控制着对于原对象的访问&#xff0c; 并允许在将请求提交给对象前后进行一些处理。 问题 为什么要控制对于某个对象的访问呢&#xff1f; 举个例子&#xff…

Ubuntu 常用命令之 mkfs 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 mkfs 是在 Linux 和其他 Unix-like 系统中用于创建文件系统的命令。在 Ubuntu 系统中&#xff0c;mkfs 命令也是用于创建文件系统的。mkfs 是一个包装器&#xff0c;它会根据用户指定的文件系统类型调用相应的程序。 mkfs 命令的…