【设计模式】命令模式
其他系列文章导航
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 类图如下:

四、总结
在软件开发中,我们经常需要处理各种请求或命令,这些请求或命令可能是来自用户、系统或其他组件。
如何有效地管理和处理这些请求或命令,对于提高软件的可维护性和可扩展性至关重要。命令模式可以帮助我们实现这一目标。
命令模式的主要思想是将请求或命令封装成一个对象,从而将发出请求的客户端与接收请求的服务端操作解耦。
这样,我们可以将请求或命令传递给服务端进行相应的处理,而不必直接依赖于服务端的具体实现。同时,通过将请求或命令封装成对象,我们可以更好地组织和管理这些请求或命令,提高代码的可读性和可维护性
相关文章:
【设计模式】命令模式
其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、什么是命令模式? 二、命令模式的优点和应用场景 三、命令模式的要素和实现 3.1 命令 3.2 具体命令 3.3 接受者 …...
Unity头发飘动效果
Unity头发飘动 介绍动作做头发飘动头发骨骼绑定模拟物理组件 UnityChan插件下载UnityChan具体用法确定人物是否绑定好骨骼节点(要做的部位比如头发等)给人物添加SpringManager骨骼管理器给骨骼节点添加SpringBone这里给每个头发骨骼都添加上SpringBone。…...
【MIKE】MIKE河网编辑器操作说明
目录 MIKE河网编辑器说明河网定义河网编辑工具栏河网文件(.nwk11)输入步骤1. 从传统的地图引入底图1.1 底图准备1.2 引入河网底图1.3 输入各河段信息2. 从ARCView .shp文件引入底图MIKE河网编辑器说明 河网编辑器主要功能有两个: ①河网的编辑和参数输人,包括数字化河网及…...
RIPV1配置实验
查看路由器路由表: 删除手工配置的静态路由项: Route1->Config->static Remove删除路由项 删除Route3的路由项,方法同上删除Route2的路由项,方法同上 完成路由器RIP配置: Route1->Config->RIP->Ne…...
快速实现农业机械设备远程监控
农业机械设备远程监控解决方案 一、项目背景 近年来,农业生产事故时有发生,农业安全问题已经成为农业生产中的关键问题,农业监控系统在农业安全生产中发挥着重要作用。农业机械设备以计划维修或定期保养为主,在日常应用的过程中因…...
解决用Fiddler抓包,网页显示你的连接不是专用/私密连接
关键:重置fiddler的证书 在Fiddler重置证书 1、Actions --> Reset All Certificates --> 弹窗一路yes 2、关掉Fiddler,重新打开 3、手机删掉证书,重新下载安装。 (如果还不行,重新试一遍,先把浏览器…...
单片机原理及应用:流水灯的点亮
流水灯是一种简单的单片机控制电路,由许多LED组成,电路工作时LED会按顺序点亮,类似于流水的效果。 下面是运行在keil上的代码,分别使用了数组,移位符和库函数来表示。 //数组法 #include <reg52.h> //头文…...
蓝桥杯宝藏排序算法(冒泡、选择、插入)
冒泡排序: def bubble_sort(li): # 函数方式for i in range(len(li)-1):exchangeFalsefor j in range(len(li)-i-1):if li[j]>li[j1]:li[j],li[j1]li[j1],li[j]exchangeTrueif not exchange:return 选择排序: 从左往右找到最小的元素,放在起始位置…...
使用@jiaminghi/data-view实现一个数据大屏
<template><div class"content bg"><!-- 全局容器 --><!-- <dv-full-screen-container> --><!-- 第二行 --><div class"module-box" style"align-items: start; margin-top: 10px"><!-- 左 -->…...
神经网络:池化层知识点
1.CNN中池化的作用 池化层的作用是对感受野内的特征进行选择,提取区域内最具代表性的特征,能够有效地减少输出特征数量,进而减少模型参数量。按操作类型通常分为最大池化(Max Pooling)、平均池化(Average Pooling)和求和池化(Sum Pooling)&a…...
微服务常见的配置中心简介
微服务架构中,常见的配置中心包括以下几种: Spring Cloud Config: Spring Cloud Config是官方推荐的配置中心解决方案,它支持将配置文件存储在Git、SVN等版本控制系统中。通过提供RESTful API,各个微服务可以远程获取和…...
银河麒麟v10 rpm安装包 安装mysql 8.35
银河麒麟v10 rpm安装包 安装mysql 8.35 1、卸载mariadb2、下载Mysql安装包3、安装Mysql 8.353.1、安装Mysql 8.353.3、安装后配置 1、卸载mariadb 由于银河麒麟v10系统默认安装了mariadb 会与Mysql相冲突,因此首先需要卸载系统自带的mariadb 查看系统上默认安装的M…...
一篇文章带你搞定CTFMice基本操作
CTF比赛是在最短时间内拿到最多的flag,mice必须要有人做,或者一支战队必须留出一块时间专门写一些mice,web,pwn最后的一两道基本都会有难度,这时候就看mice的解题速度了! 说实话,这是很大一块&…...
Spring security之授权
前言 本篇为大家带来Spring security的授权,首先要理解一些概念,有关于:权限、角色、安全上下文、访问控制表达式、方法级安全性、访问决策管理器 一.授权的基本介绍 Spring Security 中的授权分为两种类型: 基于角色的授权&…...
模式识别与机器学习(十一):Bagging
1.原理 Bagging [Breiman, 1996a] 是井行式集成学习方法最著名的代表.从名字即可看出,它直接基于自助采样法(bootstrap sampling)。给定包含m 个样本的数据集,我们先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得…...
数据压缩(哈夫曼编码)
【问题描述】在数据压缩问题中,需要将数据文件转换成由二进制字符0、1组成的二进制串,称之为编码,已知待压缩的数据中包含若干字母(A-Z),为获得更好的空间效率,请设计有效的用于数据压缩的二进制…...
移动安全APP--Frida+模拟器,模拟器+burp联动
最近测APP被通报了,问题点测得比较深,涉及到frida和burp抓包,一般在公司可能会有网络的限制,手机没办法抓包,我就直接在模拟器上试了,就在这记录一下安装过程。 目录 一、Frida安装 二、burp与逍遥模拟器…...
MATLAB遗传算法工具箱的三种使用方法
MATLAB中有三种调用遗传算法的方式: 一、遗传算法的开源文件 下载“gatbx”压缩包文件,解压后,里面有多个.m文件,可以看到这些文件的编辑日期都是1998年,很古老了。 这些文件包含了遗传算法的基础操作,包含…...
复习linux——时间同步服务
加密和安全当前都离不开时间的同步,否则各种网络服务可能不能正常运行 时间错误可能导致证书应用出错 时间同步服务 多主机协作工作时,各个主机的时间同步很重要,时间不一致会造成很多重要应用故障,利用NTP协议使网络中的各个计算机时间达到…...
如何在Linux设置JumpServer实现无公网ip远程访问管理界面
文章目录 前言1. 安装Jump server2. 本地访问jump server3. 安装 cpolar内网穿透软件4. 配置Jump server公网访问地址5. 公网远程访问Jump server6. 固定Jump server公网地址 前言 JumpServer 是广受欢迎的开源堡垒机,是符合 4A 规范的专业运维安全审计系统。JumpS…...
Java开发必看:解决国密SM2算法报错‘Unknown named curve‘的完整指南(附Bouncy Castle配置)
Java开发实战:国密SM2算法Unknown named curve报错深度解析与Bouncy Castle最佳配置指南 金融级Java应用开发中,国密算法SM2的集成就像在钢筋森林里铺设光纤——看似简单却暗藏技术陷阱。当控制台突然抛出Unknown named curve: 1.2.156.10197.1.301这个看…...
Mermaid Live Editor:代码即画布的思维可视化革命
Mermaid Live Editor:代码即画布的思维可视化革命 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-editor …...
Krita插件组件缺失故障排除实战指南
Krita插件组件缺失故障排除实战指南 【免费下载链接】krita-ai-diffusion Streamlined interface for generating images with AI in Krita. Inpaint and outpaint with optional text prompt, no tweaking required. 项目地址: https://gitcode.com/gh_mirrors/kr/krita-ai-…...
终极指南:如何用智能工具轻松突破内容访问限制
终极指南:如何用智能工具轻松突破内容访问限制 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 内容访问突破工具是现代数字工作者的必备利器,它能帮助研究人员…...
鸿蒙 ArkTS 高级样式复用:@Extend 装饰器完全解析(比 @Styles 更强大)
🔥前言:在上一篇文章《鸿蒙 ArkTS 样式复用:Styles 装饰器从入门到实战》中,我们学习了使用 Styles 实现基础样式复用。 但 Styles 不支持传参、不能使用组件专有属性,在复杂 UI 场景下能力有限。 📌 本文…...
WSL2下USB串口设备‘失踪’?手把手教你找回/dev/ttyUSB0(以Quectel模块为例)
WSL2下USB串口设备消失的终极解决方案:从原理到实战 最近在WSL2环境下调试Quectel模块时,发现一个奇怪现象:lsusb明明能识别设备,但/dev/ttyUSB0却神秘失踪。这让我想起去年调试树莓派时遇到的类似问题,但WSL2的环境特…...
Pixel Couplet Gen入门必看:Streamlit Components封装像素春联React组件
Pixel Couplet Gen入门必看:Streamlit Components封装像素春联React组件 1. 项目介绍 Pixel Couplet Gen是一款基于ModelScope大模型驱动的创意春联生成器。与传统春联设计不同,它采用了独特的8-bit像素游戏风格,将中国传统春节元素与复古电…...
技术Lead:不亲手解决问题,你的位置还稳吗?
做到技术Lead这个位置,很多人开始纠结一件事——到底该不该自己动手?技术Lead的尴尬,其实很具体比如前端设计阶段,团队在讨论一个时序收敛问题,工程师说某条路径的slack是-0.3ns,建议加pipeline。这时候Lea…...
从零开始玩转translategemma-27b-it:Ollama环境搭建与提示词详解
从零开始玩转translategemma-27b-it:Ollama环境搭建与提示词详解 1. 环境准备与快速部署 想要体验强大的图文翻译能力,首先需要搭建好运行环境。translategemma-27b-it是一个基于Ollama部署的翻译模型,支持文本和图片的翻译功能。 1.1 系统…...
从智能门铃到工业质检:拆解5个嵌入式AI落地案例,看模型压缩和硬件选型怎么选
从智能门铃到工业质检:5个嵌入式AI实战案例与选型策略 智能门铃的摄像头突然捕捉到一张陌生面孔,300毫秒内完成本地人脸比对并推送到主人手机——这背后是嵌入式AI在消费电子领域的典型应用。当算法工程师面对瑞芯微RK3588和地平线旭日X3两颗芯片的选型表…...
