重修设计模式-行为型-命令模式

重修设计模式-行为型-命令模式

The command pattern encapsulates a request as an object, thereby letting us parameterize other objects with different requests, queue or log requests, and support undoable operations.

命令模式将请求(命令)封装为一个对象,这样可以使用不同的请求参数化其他对象(将不同请求依赖注入到其他对象),并且能够支持请求(命令)的排队执行、记录日志、撤销等(附加控制)功能。

命令模式(Command Pattern)可将请求转换为一个包含与请求相关的所有信息的独立对象。 该转换让你能根据不同的请求将方法参数化、 延迟请求执行或将其放入队列中, 且能实现可撤销操作。

命令模式的核心是将一个个命令封装成一个个对象,从而方便控制和执行。命令模式的主要作用和应用场景,是用来控制命令的执行,比如,异步、延迟、排队执行命令、撤销重做命令、存储命令、给命令记录日志等等。通过命令模式,可以使得请求发送者和接收者之间解耦,从而提高了系统的灵活性和可扩展性。

命令模式主要由以下几个组件构成:

  1. 命令接口(Command):
    • 定义一个用于执行请求的接口。
    • 通常情况下,这个接口会声明一个 execute() 方法,用于执行命令。
  2. 具体命令类(Concrete Command):
    • 实现命令接口,将接收者对象绑定到具体的动作上。
    • 调用接收者的方法来执行请求。
  3. 接收者(Receiver):
    • 知道如何执行与请求相关的操作。
    • 任何类都可以作为接收者对象,只要它能执行与请求相关的操作。
  4. 调用者(Invoker):
    • 要求命令对象执行请求。
    • 它持有一个命令对象的引用,可以在需要时调用该命令。
  5. 客户端(Client):
    • 创建具体的命令对象,并设置其接收者。
    • 将命令对象传递给调用者。

举个例子,用命令模式实现灯的开关控制场景。

// 1.接收者(Receiver),封装了请求相关的操作。
class Light {  public void on() {  System.out.println("Light is on");  }  public void off() {  System.out.println("Light is off");  }  
}  // 2.命令接口(Command)
interface Command {  void execute();  
}  // 3.具体命令类:开灯命令  
class LightOnCommand implements Command {  private Light light;  public LightOnCommand(Light light) {  this.light = light;  }  @Override  public void execute() {  light.on();  }  
}  // 3.具体命令类:关灯命令  
class LightOffCommand implements Command {  private Light light;  public LightOffCommand(Light light) {  this.light = light;  }  @Override  public void execute() {  light.off();  }  
}  // 4.调用者(Invoker)  
class RemoteControl {  private Command command;  public void setCommand(Command command) {  this.command = command;  }  public void pressButton() {  command.execute();  }  
}  // 5.客户端(Client)  
public class Client {  public static void main(String[] args) {  //创建接收者Light light = new Light();  //创建命令Command lightOnCommand = new LightOnCommand(light);  Command lightOffCommand = new LightOffCommand(light);  //创建调用者并与特定命令关联RemoteControl remoteControl = new RemoteControl();  remoteControl.setCommand(lightOnCommand);  remoteControl.pressButton(); // 输出: Light is on  remoteControl.setCommand(lightOffCommand);  remoteControl.pressButton(); // 输出: Light is off  }  
}

总结

命令模式的主要作用和应用场景,是用来控制命令的执行,比如,异步、延迟、排队执行命令、撤销重做命令、存储命令、给命令记录日志等等,这才是命令模式能发挥作用的地方。

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

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

相关文章

【ESP32】DIY一个电子测光仪

这里写目录标题 0 前言1 开箱2 过程2.1 下载固件2.2 烧录固件2.3 编程环境 Thonny2.4 点灯大师2.5 TFT屏幕2.6 BH1750传感器 成果展示 0 前言 开发板:ESP32-S3-5691 开发环境:circuitpythonthony 1 开箱 2 过程 2.1 下载固件 使用circuitpython的方式开…

MSA+抑郁症模型总结

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。🎥 希望在…

解决Jenkins使用 Git 参数插件拉取 commit 列表缓慢问题

Jenkins使用 Git 参数插件拉取 commit 列表缓慢问题 项目问题问题描述解决方案具体实现 项目问题 在 Jenkins 中使用 Git 参数插件 进行参数化构建,具有多方面的重要性和好处。这不仅提高了构建的灵活性和透明度,还能大大提升开发和运维效率。以下是使用…

黑马智数Day7

获取行车管理计费规则列表 封装接口 export function getRuleListAPI(params) {return request({url: parking/rule/list,params}) } 获取并渲染数据 import { getRuleListAPI } from /apis/carmounted() {this.getRuleList() }methods: {// 获取规则列表async getRuleList(…

员工电脑怎么监控?这些电脑监控软件必备

在当今远程办公、灵活工时盛行的时代,如何掌握员工的在线活动、确保工作效率和数据安全成为许多企业关注的焦点。电脑监控软件作为管理工具中的关键一环,可以有效帮助企业了解员工的在线行为,避免效率低下和数据泄露等风险。今天我们就来介绍…

学习干货|实战学习应急响应之Windows日志分析,网络安全零基础入门到精通教程!

前言 本次环境将从大赛内与实战环境相结合去了解在应急响应中Windows日志分析的几个关键点,符合大赛及真实环境案例,本次环境将从WEB层面的日志分析到主机内的几种关键日志分析和重点功能进行排查 题目描述:某台Windows服务器遭到攻击者入侵…

零基础光伏人,数据计算轻松拿捏

在可再生能源领域,光伏产业以其清洁、可再生的特点日益受到全球关注。然而,对于初学者或“零基础光伏人”而言,光伏项目涉及的一系列数据计算和专业知识往往显得复杂而难以入手。幸运的是,随着技术的进步,一系列光伏计…

一文搞懂链表相关算法

目录 链表的逆序和截断 逆序 截断 查找链表的中间节点 力扣题 博主主页:东洛的克莱斯韦克-CSDN博客 链表的逆序和截断 逆序 推荐使用头插法逆序,首先要 new 一个虚拟头节点——newNode。如下图 链表的头节点为head,由cur指针指向head&a…

红外热成像技术开启光伏检测新视界

随着全球对可再生能源需求的不断增加,光伏发电系统的应用日益广泛。然而,光伏组件在长期运行中可能会出现各种故障,如热斑效应、隐裂、接线盒故障等,这些问题不仅影响光伏系统的发电效率,还可能引发安全隐患。 红外热成…

基于vue框架的的社区智慧养老系统1mo30(程序+源码+数据库+调试部署+开发环境)

系统程序文件列表 项目功能:老人,员工,老人档案,养生视频,社区医生,就医信息,在线咨询,咨询回复,菜品信息,点餐订单,服务预约,通知信息,服务评价,健康关爱,新闻公告,监控日志 开题报告内容 以下是一份基于Vue框架的社区智慧养老系统的开题报告,详细阐述…

龙蜥8.6 配置用户登录次数和锁定策略(已亲测)

操作系统:龙蜥8.6 x86_64 查看是否安装pam模块 rpm -qa | grep pam 查看可以使用的认证模块,因为有的系统是pam_tally2. cd /etc/pam.d ls 经过查看,该服务器是使用的pam_faillock 模块 打开/etc/pam.d/password-auth 的 PAM 配置文件…

【6.4】位运算-判断是否存在重复元素

一、题目 给定一个整数数组,判断 是否存在重复元素 。如果存在一值在数组中 出现至少两次 ,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。 示例 1: 输入: [ 1 , 2 , 3 , 1 ] 输出: true 示例 2: 输入: [ 1 , 2 , 3 , 4 ] 输出…

PCB打样下单流程

PCB打样下单流程 一、PCB打样在线下单流程1.平台登录2.PCB打样领券3.进入下单系统4.上传PCB文件5.PCB订单界面 PCB(印刷电路板)打样是验证设计、优化性能和推进项目进度的关键环节。随着互联网的…

Python爬虫知识体系-----正则表达式-----持续更新

数据科学、数据分析、人工智能必备知识汇总-----Python爬虫-----持续更新:https://blog.csdn.net/grd_java/article/details/140574349 文章目录 一、正则基础1. 为什么使用正则2. 正则与re模块简介 二、正则表达式1. 匹配单个字符与数字2. 限定符3. 定位符4. 选择匹…

yolo标签自动标注(使用python和yolo方法)

yolo代码自动标注 1.引言1.初阶“自动标注”,给每个图像都生成一个固定的标注文件,进而在labglimg中对矩形框进行微调,减少标注的工作量2.高阶自动标注,利用我们训练好的(但是没有特别精准的)yolo文件先对每…

在 WPF 中,如何使用命令来替代事件处理?

在 WPF(Windows Presentation Foundation)中,命令是一种非常强大的替代传统事件处理的方法,特别适用于 MVVM(Model-View-ViewModel)架构。命令可以实现界面(View)和逻辑(…

语音 AI 革命:未来,消费者更可能倾向于与 AI 沟通,而非人工客服

「未来,消费者更可能倾向于与 AI 沟通,而非人工客服,因为这将成为解决问题的最高效途径。」 这篇来自 Bessemer Venture Partners 的报告,是目前为止对语音 AI 在企业应用上最完整清晰的一次梳理。 核心要点: 尽管市…

过去几年电子学习的趋势

近年来,在技术和不断变化的学习者期望的推动下,电子学习已经发展成为一种适应性强、沉浸式和社会化的教育形式。个性化已成为最具影响力的趋势之一,Coursera和LinkedIn Learning等平台为个人量身定制内容。这些平台使用人工智能来建议课程、跟…

Java基础-Java多线程机制

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 一、引言 二、多线程的基本概念 1. 线程与进程 2. 多线程与并发 3. 多线程的优势 三、Java多线程的实…

springboot 之 整合springdoc2.6 (swagger 3)

版本 springboot 3.3.5 jdk 17 springdoc 2.6.0 依赖pom <dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.6.0</version> </dependency>注解对比…