探索设计模式:命令模式

探索设计模式:命令模式

    • 🧐1. 概念
    • 🎯2. 作用
    • 📦3. 实现
      • 3.1 定义命令接口
      • 3.2 实现具体命令
      • 3.3 实现接收者
      • 3.4 实现调用者
      • 3.5 使用
    • 💻4. 应用场景

在这里插入图片描述

  命令模式Command Pattern)就是一种行为型设计模式。其核心思想是将请求封装成一个对象,从而使你可以使用不同的请求、队列或者请求日志参数化其他对象,同时支持可撤销的操作。通过命令模式,可以将请求的发起者和接收者完全解耦,提高系统的灵活性和可扩展性。

🧐1. 概念


  想象一下,当你在家里使用遥控器控制电视时,你按下遥控器上的“电源”按钮,电视就会开启或关闭。在这个过程中,遥控器(调用者)并不知道电视(接收者)是如何工作的,它只是发送了一个“打开”或“关闭”的请求。命令模式正是基于这样的思路,将请求本身封装成一个对象,这样可以更容易地管理和执行请求。

命令模式通常包含四个关键角色:

  1. 命令Command):这是一个抽象类或接口,定义了执行操作的标准方法。所有的具体命令类都实现了这个接口,确保它们可以以统一的方式被调用。
  2. 具体命令Concrete Command):这是命令接口的具体实现,包含了执行操作的具体逻辑。每个具体命令类都关联了一个接收者对象,并且知道如何调用接收者的某个方法来完成任务。
  3. 接收者Receiver):接收者是真正执行命令的对象。它包含了具体的业务逻辑,当一个命令被执行时,实际上是调用了接收者的一个或多个方法。
  4. 调用者Invoker):调用者负责触发命令的执行。它可以持有一个或多个命令对象,并在适当的时候调用命令的执行方法。调用者不需要知道命令的具体实现细节,只需要知道如何调用即可。

🎯2. 作用


  1. 解耦:命令模式最大的优势在于它能够彻底解耦命令的发起者和接收者,使两者之间的依赖关系降到最低。这意味着可以在不改变原有代码的情况下,轻松地引入新的命令类型或修改现有命令的行为。
  2. 扩展性:由于命令对象实现了统一的接口,因此可以很容易地添加新的命令类,而不会影响到现有的系统接口。此外,命令模式还支持组合命令,即一个命令可以包含多个子命令,形成更复杂的操作序列。

📦3. 实现


  假设我们要开方法一个简单的智能家居控制系统,用户可以通过遥控器(调用者)控制家中的各种电器设备(接收者),如灯光、电视等。

我们可以通过命令模式来实现这一功能。

3.1 定义命令接口


public interface Command {void execute();
}

3.2 实现具体命令


public class LightOffCommand implements Command {private Light light;public LightOffCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.turnOff();}
}
public class LightOnCommand implements Command {private Light light;public LightOnCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.turnOn();}}

3.3 实现接收者


public class Light {public void turnOn(){System.out.println("Light is on");}public void turnOff(){System.out.println("Light is off");}}

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 CommandClient {public static void main(String[] args) {Light light = new Light();// 遥控器对象RemoteControl remoteControl = new RemoteControl();// 具体命令对象LightOnCommand lightOnCommand = new LightOnCommand(light);LightOffCommand lightOffCommand = new LightOffCommand(light);// 为遥控器设置命令remoteControl.setCommand(lightOnCommand);// remoteControl.setCommand(lightOffCommand);// 按下遥控器按钮remoteControl.pressButton();}}

💻4. 应用场景


  1. 用户界面操作:在图形用户界面中,命令模式常用于处理各种用户输入事件,如按钮点击、菜单选择等。通过将这些操作封装成命令对象,界面组件可以独立于具体的业务逻辑,提高了代码的可复用性和可测试性。
  2. 事务管理:在需要支持事务回滚的系统中,命令模式可以帮助实现复杂的撤销/重做功能。每个命令不仅包含执行操作的方法,还可以包含撤销操作的方法,从而在必要时恢复到之前的状态。
  3. 队列处理:当系统需要处理大量异步请求时,可以使用命令模式将请求封装成命令对象并放入队列中等待处理。这中做法有助于平滑负载,避免资源争用。
  4. 日志记录:对于需要记录操作历史以便后续审计或分析的系统,命令模式提供了一种自然的方式来保存命令对象,方便日后查询和恢复。

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

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

相关文章

茅台最新任务脚本

茅台最新任务脚本 –小白教程— 这个脚本的作用是实现i茅台应用的自动预约功能,主要功能包括生成请求头、预约商品、计算距离和库存情况、发送微信推送消息等。 代码如下#!/usr/bin/python3cron: 0 0 9/21 * * * new Env(i茅台) import logging import sysimpor…

​CSS之三

CSS三大特性 CSS 有三个非常重要的三个特性:层圣性、继承性、优先级 层叠性 相同选择器给设置相同的样式,此时一个样式就会覆盖(层曼)另一个冲突的样式。层曼性主要解决样式冲突的问题 层叠性原则: - 样式冲突,遵循的原则是就近原则,哪个…

C++设计模式创建型模式———简单工厂模式、工厂方法模式、抽象工厂模式

文章目录 一、引言二、简单工厂模式三、工厂方法模式三、抽象工厂模式四、总结 一、引言 创建一个类对象的传统方式是使用关键字new , 因为用 new 创建的类对象是一个堆对象,可以实现多态。工厂模式通过把创建对象的代码包装起来,实现创建对…

python爬虫抓取豆瓣数据教程

环境准备 在开始之前,你需要确保你的Python环境已经安装了以下库: requests:用于发送HTTP请求。BeautifulSoup:用于解析HTML文档。 如果你还没有安装这些库,可以通过以下命令安装: pip install requests…

代码-画图函数示例

热力图 import matplotlib.pyplot as plt import seaborn as sns import numpy as npdef create_heatmap(people, categories, dataNone, title热力图, xlabel类别, ylabel人员,value_range(0.6, 0.95), figsize(10, 6),cmapYlOrRd, decimal_places3):"""创建热…

2024最新Twitter养号全面指南,品牌起号必看!

X (Twitter)作为活跃用户数以亿计的社交媒体平台,用户数依然在不断增长,其中巨大的流量吸引着个人用户与品牌和卖家。 Twitter养号是有必要的,有大量案例表明养好号,可以大幅度降低账号被冻结的几率,并提升账号的稳定…

百度如何打造AI原生研发新范式?

👉点击即可下载《百度AI原生研发新范式实践》资料 2024年10月23-25日,2024 NJSD技术盛典暨第十届NJSD软件开发者大会、第八届IAS互联网架构大会在南京召开。本届大会邀请了工业界和学术界的专家,优秀的工程师和产品经理,以及其它行…

基于大语言模型(LLM)自主Agent 智能体综述

近年来,LLM(Large Language Model)取得了显著成功,并显示出了达到人类智能的巨大潜力。基于这种能力,使用LLM作为中央控制器来构建自助Agent,以获得类人决策能力。 Autonomous agents 又被称为智能体、Agent。指能够通过感知周围环境、进行规划以及执行动作来完成既定任务。…

电脑怎么设置开机密码:保障个人信息安全的第一步

在数字化时代,个人信息的安全至关重要。电脑作为我们日常工作和生活中不可或缺的设备,存储了大量的私人数据和敏感信息。为了防止未经授权的访问,设置开机密码是保护个人隐私和信息安全的基本措施之一。本文将详细介绍如何在不同操作系统下为…

分析 std::optional 的使用与常见错误

文章目录 引言常见错误及解决方案1. 错误使用 std::optional 变量进行算术运算2. 错误检查 std::optional 是否有值3. 忽视 std::optional 的默认值 结论 引言 std::optional 是 C17 引入的一个模板类,用于表示可能有也可能没有值的情况。它特别适用于函数返回值&a…

DB-GPT系列(二):DB-GPT部署(镜像一键部署、源码部署)

一、简介 DB-GPT 是一个开源项目,其将大语言模型 LLM 与数据库紧密结合。该项目主要致力于探索如何让预训练的大规模语言模型(例如 GPT)能够直接与数据库进行交互,从而生成更为准确且信息丰富的回答。 DB-GPT部署后能否直接使用…

Web组件之 Listener (监听器)

文章目录 1.1 Listener概述1.2 Listener快速入门① xml版本② 注解版本 1.3 案例:模拟spring框架 1.1 Listener概述 ​ JavaWeb 中的监听器是监听 ServletContext HttpSession HttpServletRequest 三个数据域对象创建和销毁以及监听数据域对象中数据的变化&#xf…

【论文翻译】IJCAI 2019 | Graph WaveNet:用于深度时空图建模的Graph WaveNet

论文题目Graph WaveNet for Deep Spatial-Temporal Graph Modeling作者团队Zonghan Wu, Shirui Pan, Guodong Long, Jing Jiang, Chengqi Zhang机构澳大利亚悉尼科技大学人工智能中心 (UTS) 和 澳大利亚莫纳什大学发表会议IJCAI 2019论文链接https://www.ijcai.org/proceedings…

Java数组的定义与使用

今天来学习Java数组的定义与使用 目录 1 数组的基本概念1.1 数组的意义1.2 数组的定义1.3 数组的创建及初始化1.3.1 数组的创建1.3.2 数组的初始化 1.4 数组的使用1.4.1 数组中的元素访问1.4.2 遍历数组运行结果运行结果 2 数组是引用类型2.1 初始 JVM 的内存分布2.2 基本类型变…

https://tieba.baidu.com/p/9247698007

微深节能的库区智能化无人天车管理系统结合了格雷母线技术,提供了一种高精度的定位解决方案。格雷母线系统能够实现连续或断续的位置检测,精度高达≤5mm,适用于需要高精度作业的场景,如货物搬运和堆放。这种系统通过实时交互&…

创作里程碑:纪念日回顾与展望

目录 机缘:创作者初心 1. 实战项目 2. 日常学习 3. 技术交流 4. 总结 收获:创作者动力 创作与工作、学习的关系 憧憬:职业规划与创作规划 职业规划: 创作规划: 机缘:创作者初心 回望自己踏上…

软考(中级-软件设计师)数据库篇(1101)

第6章 数据库系统基础知识 一、基本概念 1、数据库 数据库(Database ,DB)是指长期存储在计算机内的、有组织的、可共享的数据集合。数据库中的数据按一定的数据模型组织、描述和存储,具有较小的冗余度、较高的数据独立性和扩展…

go-zero 的使用

目录 1. 生成 user api 服务 2. 生成 user rpc 服务 3. 生成 user model 模型 4. 编写 user rpc 服务 1 修改配置文件 user.yaml 2 添加 user model 依赖 3 添加用户登录逻辑 Login 5. 编写 user api 服务 1 修改配置文件user.yaml 2 添加 user rpc 依赖 3 添加用户…

基金委:目前资助率过低,危害大,应提升至30~35%,增大青年、面上项目经费

国家基金委 近日,国家基金委发表题为《近十年 NSF资助率和资助强度上升 对我国科学基金资助工作的启示》文章,文章基于近十年 NSF总体资助变化,提出对我国科学基金资助工作启示,阐述了国家自然基金项目资助率下降情况、危害,并提…

NPM 包开发与优化全面指南

前言 Hey, 我是 Immerse系列文章首发于【Immerse】,更多内容请关注该网站转载说明:转载请注明原文出处及版权声明! 1. 理解 NPM 包的结构 1.1 package.json 文件:包的核心 package.json文件是 NPM 包的中央配置,定…