「聊设计模式」之命令模式(Command)

news2024/11/26 19:40:02

🏆本文收录于《聊设计模式》专栏,专门攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎持续关注&&收藏&&订阅!


前言

  在面向对象设计中,设计模式是重要的一环。设计模式可以帮助我们更好地理解和分析代码,同时也能够提高代码的可读性、可扩展性和可维护性。命令模式是常用的设计模式之一,它将请求封装成一个对象,从而可以用不同的请求来进行参数化和操作化。本文将介绍命令模式的相关概念及实现方法。

摘要

本文将从以下几个方面来介绍命令模式:

  • 命令模式的概念及作用
  • 命令模式的实现方法
  • 命令模式的优点和缺点
  • 命令模式的应用场景

命令模式

概念

  命令模式是一种行为设计模式,它将请求封装成一个对象,从而允许使用不同的请求、队列或者日志来参数化其他对象。命令模式的核心在于将请求和实现分离开,从而可以使请求具有独立的生命周期和实现。

结构

命令模式包含以下几个角色:

  • 命令(Command):定义了一个操作的接口,包括执行操作的方法和撤销操作的方法。
  • 具体命令(ConcreteCommand):实现了命令接口,包含了具体的操作和接受者。
  • 接受者(Receiver):执行命令所要进行的操作,知道如何实现具体的请求。
  • 调用者(Invoker):负责调用命令对象执行请求,通常会持有命令对象的实例。
  • 客户端(Client):创建具体的命令对象并设置其接收者,命令对象的生命周期由客户端管理。

命令模式结构如图所示:

在这里插入图片描述

  命令模式的作用在于允许客户端通过命令对象来将请求封装成一个独立的对象,从而可以方便地进行调用、传递和管理。命令模式还可以实现多级撤销、宏命令、命令队列等功能,是一个非常实用的设计模式。

命令模式的扩展

  在软件开发中,有时将命令模式与前面学的组合模式联合使用,这就构成了宏命令模式,也叫组合命令模式。宏命令包含了一组命令,它充当了具体命令与调用者的双重角色,执行它时将递归调用它所包含的所有命令,其具体结构如下图所示:

在这里插入图片描述

命令模式的优缺点

优点

命令模式具有以下几个优点:

  • 降低系统的耦合度:命令模式将请求和实现分离开,从而可以降低系统的耦合度,使得系统更易于扩展和维护。
  • 可扩展性:命令模式可以实现多级撤销、宏命令和命令队列等功能,从而可以方便地扩展系统的功能。
  • 灵活性:命令模式可以动态地添加或删除命令,从而可以灵活地组织命令流。

缺点

命令模式也存在一些缺点:

  • 过多的具体命令类:如果系统中有许多具体命令类,那么命令模式将会导致系统变得复杂,不易于维护。
  • 命令发起者和命令执行者的解耦:虽然命令模式降低了系统的耦合度,但也会导致命令发起者和命令执行者之间的解耦问题。

应用场景

命令模式是一种常见的设计模式,可以应用于各种场景中,例如:

  • 图形界面应用程序中的快捷键:将快捷键封装成一组命令对象,并将这些命令对象注册到快捷键管理器中,从而可以方便地进行调用和管理。
  • 服务器端应用程序中的请求处理:将请求封装成一组命令对象,并将这些命令对象注册到请求处理器中,从而可以方便地进行调用、传递和管理。
  • 游戏中的角色控制:将角色控制命令封装成一组命令对象,并将这些命令对象注册到角色管理器中,从而可以方便地进行调用、传递和管理。

模式实现

以下是命令模式的一个简单实现:

定义命令接口

package com.example.javaDesignPattern.command;

/**
 * @Author bug菌
 * @Date 2023-09-19 22:04
 */
public interface Command {
    void execute();
    void undo();
}

具体命令

package com.example.javaDesignPattern.command;

/**
 * @Author bug菌
 * @Date 2023-09-19 22:04
 */
public class ConcreteCommand implements Command {
    private Receiver receiver;

    public ConcreteCommand(Receiver receiver) {
        this.receiver = receiver;
    }

    public void execute() {
        receiver.action();
    }

    public void undo() {
        receiver.undo();
    }
}

接受者

package com.example.javaDesignPattern.command;

/**
 * @Author bug菌
 * @Date 2023-09-19 22:05
 */
public class Receiver {
    public void action() {
        System.out.println("执行命令");
    }
    public void undo() {
        System.out.println("撤销命令");
    }
}

调用者

package com.example.javaDesignPattern.command;

/**
 * @Author bug菌
 * @Date 2023-09-19 22:05
 */
public class Invoker {
    private Command command;
    public void setCommand(Command command) {
        this.command = command;
    }
    public void executeCommand() {
        command.execute();
    }
    public void undoCommand() {
        command.undo();
    }
}

客户端

package com.example.javaDesignPattern.command;

/**
 * @Author bug菌
 * @Date 2023-09-19 22:05
 */
public class Client {
    public static void main(String[] args) {
        Receiver receiver = new Receiver();
        Command command = new ConcreteCommand(receiver);
        Invoker invoker = new Invoker();
        invoker.setCommand(command);
        invoker.executeCommand();
        invoker.undoCommand();
    }
}

执行结果如下:

在这里插入图片描述

  以上代码演示了命令模式的一个简单实现,其中包含了命令、具体命令、接受者、调用者和客户端几个角色。具体实现中,客户端创建了一个具体命令对象并将其设置到调用者中,调用者负责调用命令对象执行相应操作,并可以执行撤销操作。

小结

  本文介绍了命令模式的相关概念和实现方法,以及其优点和缺点。命令模式是一种常见的设计模式,可以应用于各种场景中,例如图形界面应用程序、服务器端应用程序和游戏中的角色控制等。在应用命令模式时,需要充分考虑系统的需求和设计,选择合适的命令对象和接收者,从而可以实现系统的功能和需求。

附录源码

  如上涉及代码均已上传同步在GitHub,提供给同学们参考性学习。

☀️建议/推荐你


  如果想系统性的全面学习设计模式,建议小伙伴们直接毫无顾忌的关注这个专栏《聊设计模式》,无论你是想提升自己的编程技术,还是渴望更好地理解代码背后的设计思想,本专栏都会为你提供实用的知识和启发,帮助你更好地解决日常开发中的挑战,将代码变得更加优雅、灵活和可维护!

📣关于我


我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。

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

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

相关文章

c:Bubble Sort

/*****************************************************************//*** \file SortAlgorithm.h* \brief 业务操作方法* VSCODE c11* \author geovindu,Geovin Du* \date 2023-09-19 ***********************************************************************/ #if…

前端知识以及组件学习总结

JS 常用方法 js中字符串常用方法总结_15种常见js字符串用法_<a href"#">leo</a>的博客-CSDN博客 <script>var str"heool"console.log(str.length);console.log(str.concat(" lyt"));console.log(str.includes("he&quo…

WebPack5基础使用总结(一)

WebPack5基础使用总结 1、WebPack1.1、开始使用1.2、基本配置 2、处理样式资源2.1、处理Css资源2.2、处理Less资源2.3、处理Sass和Scss资源2.4、处理Styl资源 3、处理图片资源3.1、输出资源情况3.2、对图片资源进行优化 4、修改输出资源的名称和路径4.1、自动清空上次打包资源 …

想了解期权分仓交易和开户?这里告诉你。

期想了解期权分仓交易和开户&#xff1f;这里告诉你。权就是合约交易&#xff0c;通过买卖认购和认沽期权合约实现未来是否能赚钱&#xff0c;具备做多和做空T0双向交易机制&#xff0c;期权分仓开户就是零门槛开通期权账户&#xff0c;下文介绍想了解期权分仓交易和开户&#…

经验分享|作为程序员之后了解到的算法知识

欢迎关注博主 六月暴雪飞梨花 或加入【六月暴雪飞梨花】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术…

Java————栈

一 、栈 Stack继承了Vector&#xff0c;Vector和ArrayList类似&#xff0c;都是动态的顺序表&#xff0c;不同的是Vector是线程安全的。 是一种特殊的线性表&#xff0c; 其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端称为栈顶&#xff0c;另…

《计算机视觉中的多视图几何》笔记(4)

4 Estimation – 2D Projective Transformations 本章主要估计这么几种2D投影矩阵&#xff1a; 2D齐次矩阵&#xff0c;就是从一个图像中的点到另外一个图像中的点的转换&#xff0c;由于点的表示都是齐次的&#xff0c;所以叫齐次矩阵3D到2D的摄像机矩阵基本矩阵三视图之间的…

基于conda的相关命令

conda 查看python版本环境 打开Anaconda Prompt的命令输入框 查看自己的python版本 conda env list激活相应的python版本(环境&#xff09; conda avtivate python_3.9 若输入以下命令可查看python版本 python -V #注意V是大写安装相应的包 pip install 包名5.查看已安装…

智能井盖:提升城市井盖安全管理效率

窨井盖作为城市基础设施的重要组成部分&#xff0c;其安全管理与城市的有序运行和群众的生产生活安全息息相关&#xff0c;体现城市管理和社会治理水平。当前&#xff0c;一些城市已经将智能化的窨井盖升级改造作为新城建的重要内容&#xff0c;推动窨井盖等“城市部件”配套建…

工控机通过Profinet转Modbus RTU网关连接变频器与电机通讯案例

在工业自动化系统中&#xff0c;工控机扮演着重要的角色&#xff0c;它是数据采集、处理和控制的中心。工控机通过Profinet转Modbus RTU网关连接变频器与电机通讯&#xff0c;为工业自动化系统中的设备之间的通信提供了解决方案。工控机通过Profinet转Modbus RTU网关的方式&…

(leetcode)单值二叉树

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 题目&#xff1a; 思路&#xff1a; 代码&#xff1a; 画图与分析&#xff1a; 题目&#xff1a; 如果二叉树每个节点都具有相同的值&#xff0c;那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时&…

2023年以就业为目的学习Java还有必要吗?(文末送书)

目录 一、活力四射的 Java二、从零开始学会 Java三、准备工作四、基础知识五、进阶知识六、高级知识七、结语参与方式 大家好&#xff0c;我是哪吒。 文末送5本《Java编程动手学》 今天来探讨一个问题&#xff0c;现在学 Java 找工作还有优势吗&#xff1f; 在某乎上可以看到…

MS1861 视频处理与显示控制器 HDMI转MIPI LVDS转MIPI带旋转功能 图像带缩放,旋转,锐化

1. 基本介绍 MS1861 单颗芯片集成了 HDMI 、 LVDS 和数字视频信号输入&#xff1b;输出端可以驱动 MIPI(DSI-2) 、 LVDS 、 Mini-LVDS 以及 TTL 类型 TFT-LCD 液晶显示。可支持对输入视频信号进行滤波&#xff0c;图 像增强&#xff0c;锐化&#xff0c;对比度调节&am…

ai虚拟主播看车线上虚拟三维展示节约成本和资源

线上车展汽车3D展厅突破了前期虚拟和现实的障碍&#xff0c;使用户无论身在哪个城市&#xff0c;都可以随时随地在线3D看车&#xff0c;极大的方便了消费者的看车的线上体验。因此对企业来说&#xff0c;有购车意愿的顾客必然是会提高成交的可能性&#xff0c;那么如何满足顾客…

固定资产管理系统的特点有哪些

固定资产管理系统是一种用于管理企业固定资产的软件。其功能如下&#xff1a;  自动化管理&#xff1a;固定资产管理系统可自动管理企业固定资产&#xff0c;包括采购、仓储、申请、维护、损坏等流程&#xff0c;大大提高了工作效率。  实时监控&#xff1a;固定资产管理系…

Python 点云处理--半径滤波 【open3d实现】【可视化输出】

目录 一、原理二、环境搭建三、代码实现一、原理 半径滤波以某点为中心画一个圆计算落在该圆中点的数量,当数量大于给定值时,则保留该点,数量小于给定值则剔除该点。因此,使用该算法时需要对搜索半径和近邻点个数阈值进行设置。 二、环境搭建 安装open3d三方库 直接: pi…

准备篇(三)Python 爬虫第三方库

第三方库无法将 "pip" 识别ModuleNotFoundError: No module named pip install 安装路径相关问题requests 库和 BeautifulSoup 库requests 库BeautifulSoup 库第三方库 Python 的 标准库 中提供了许多有用的模块和功能,如字符串处理、网络通信、多线程等,但它们并…

python3.11版本pip install ddddocr调用时报错got an unexpected keyword argument ‘det‘ 解决

一、如图出现如下问题 ddddocr.__init__() got an unexpected keyword argument det出现问题原因&#xff1a;python3.11默认安装版本就旧版的ddddocr1.0的&#xff0c;所以导致如下报错 二、解决方案一&#xff08;推荐&#xff09; python3.11的环境直接安装这个即可&…

我们如何将机器学习应用到 Positive Technologies 产品中

今天&#xff0c;我们将向您介绍 ML 如何帮助安全专家实现自动化操作并检测网络攻击。首先&#xff0c;我们将分析理论基础&#xff0c;然后用我们工作中的案例加以证明。 我们为什么使用 ML 在讨论使用机器学习模型的必要性之前&#xff0c;我们有必要先了解安全工具的工作原…

2023年天津专升本建档立卡、退役免试、大赛获奖免试招生计划

有关普通高校&#xff0c;市大学软件学院&#xff0c;市教育招生考试院&#xff1a; 经有关高校申请&#xff0c;并结合天津实际情况&#xff0c;共安排2023年普通高校高职升本科招生计划3160人&#xff0c;其中安排“建档立卡贫困家庭毕业生专升本专项计划”112人&#xff0c…