命令模式的学习与使用

1、命令模式的学习

  当你想要将请求与实际执行操作的对象解耦时,可以使用命令模式。它将一个请求封装为一个对象,从而使你可以根据不同的请求将其参数化,将请求队列或日志请求,并支持可撤销的操作。
  命令模式由以下几个核心角色组成:

  • 命令(Command):定义了执行操作的接口,并包含执行操作所需的方法。
  • 具体命令(Concrete Command):实现了命令接口,负责执行具体的操作。
  • 接收者(Receiver):执行实际操作的对象。它知道如何执行命令相关的操作。
  • 调用者(Invoker):负责调用命令对象来执行请求。它只知道如何调用命令,而不知道命令执行的具体细节。
  • 客户端(Client):创建具体命令对象并设置其接收者。
    在这里插入图片描述

2、命令模式的使用

  假设有一个电灯类 Light,其中有打开灯和关闭灯的方法。请使用命令模式设计一个灯控制器,该控制器可以接收不同的命令并执行相应的操作,包括打开灯、关闭灯以及撤销上一次操作。
接收者

public class Light {public void turnOn() {System.out.println("电灯已打开");}public void turnOff() {System.out.println("电灯已关闭");}
}

抽象命令

public interface LightCommand {/*** 打开电灯*/void turnOn();/*** 关闭电灯*/void turnOff();/*** 撤销上一步*/void undo();
}

具体命令

public class LightCommandImpl implements LightCommand {private Light light;private String lastStatus;public LightCommandImpl(Light light) {this.light = light;}@Overridepublic void turnOn() {light.turnOn();lastStatus = "已打开";}@Overridepublic void turnOff() {light.turnOff();lastStatus = "已关闭";}@Overridepublic void undo() {if (StringUtils.isNotBlank(lastStatus)) {lastStatus = "已关闭".equals(lastStatus) ? "已打开" : "已关闭";}System.out.println("撤销:" + lastStatus + "操作");}
}

调用者

public class LightControl {private LightCommand lightCommand;public LightControl(LightCommand lightCommand) {this.lightCommand = lightCommand;}public void turnOn() {lightCommand.turnOn();}public void turnOff() {lightCommand.turnOff();}public void undo() {lightCommand.undo();}
}

客户端

public class LightClient {public static void main(String[] args) {Light light = new Light();LightCommand lightCommand = new LightCommandImpl(light);LightControl lightControl = new LightControl(lightCommand);lightControl.turnOn();lightControl.turnOff();lightControl.undo();}
}
电灯已打开
电灯已关闭
撤销:已打开操作

3、总结

  这里的 Light 类充当了接收者角色,负责实际执行操作。LightCommand 接口定义了命令的操作方法,并有具体的实现类 LightCommandImpl 实现了该接口,将命令操作委托给 Light 类。LightControl 类充当了请求者角色,用于接收命令并执行相应的操作。

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

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

相关文章

Can’t connect to MySQL server on ‘localhost’ (10061)

标题:Can’t connect to MySQL server on ‘localhost’ (10061) 一种情况是,mysql服务没有开启, 解决方式:以管理员身份进入cmd,然后输入net start mysql,注意这里的mysql,指的是你的mysql服务的名称&am…

Vue + electron 构建桌面应用程序

文章目录 需求分析解决 需求 使用Vue.js构建桌面应用程序 分析 选择一个Vue.js框架:选择一个适合你的Vue.js框架。推荐使用Electron,因为它是最流行的桌面应用程序框架之一,而且与Vue.js非常兼容。还有其他框架,如 Proton Native…

【SCI/EI/CNKI录用案例】最快8天录用

生命科学类SCI 【期刊简介】IF:2.5-3.0,JCR2区,中科院3区 【检索情况】SCI 在检,正刊 【征稿领域】生物科学、环境科学、医学科学和健康科学方向相关研究均可 【截稿时间】仅剩10篇版面左右 录用案例:仅1个月13天录…

基于深度学习的高精度工人安全帽检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度工人安全帽检测识别系统可用于日常生活中或野外来检测与定位工人安全帽目标,利用深度学习算法可实现图片、视频、摄像头等方式的工人安全帽目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系统采用…

ThingsBoard IoT Gateway 专栏 分享 前言

最近有朋友询问tb-gateway相关的问题,于是抽业余时间查看了一下官方文档,并做了一些尝试和案例。接下来我会将这些分享给大家。这也是一个系列,将会和我的ThingsBoard专栏放在一起。 ThingsBoard IoT Gateway 能够帮助你将连接到传统和第三方…

idea中如何过滤某些文件不提交

文章目录 前言设置.gitignore文件解决方案 设置新的忽略文件具体步骤如下 常用过滤文件 前言 在开发过程中,经常会遇到一些文件是我们不想提交的内容。那么应该如何过滤掉?不去提交到我们的git仓库? 比如,我们常用的一些配置文件…

全新FinClip Studio 现已发布上线;正式支持多租户能力

FinClip 的使命是使您(业务专家和开发人员)能够通过小程序解决关键业务流程挑战,并完成数字化转型的相关操作。不妨让我们看看在本月的产品与市场发布亮点,看看是否有助于您实现目标。 产品方面的相关动向👇&#x1f…

vue表单验证的时候提示 async-validator:‘‘xxx is not a string“

对vue不是很熟悉,在做vue开发的时候,遇到一个很奇怪的问题,输入框涉及到number类型的时候会提示 is not a string 这块的代码是这样的: v-decorator"[ fraction, { rules: [{ required: true, type: number, message: 请输入…

Spring Boot 中的 @RabbitListener 注解是什么,原理,如何使用

Spring Boot 中的 RabbitListener 注解是什么,原理,如何使用 在 RabbitMQ 中,消息的接收需要通过监听队列来实现。在 Spring Boot 应用程序中,可以使用 RabbitListener 注解来监听队列,并在接收到消息时执行指定的方法…

【网络原理】TCP连接管理机制(三次握手四次挥手)

🥊作者:一只爱打拳的程序猿,Java领域新星创作者,CSDN、阿里云社区优质创作者。 🤼专栏收录于:计算机网络原理 在使用TCP协议进行网络交互时,TCP会进行三次握手即建立连接,TCP四次挥手…

【springboot+云计算】B/S医院信息管理系统源码(云HIS)

一、基于云计算技术的B/S架构的医院管理系统(简称云HIS) 采用前后端分离架构,前端由Angular框架、JavaScript语言开发;后端使用Java语言开发。系统遵循服务化、模块化原则开发,具有强大的可扩展性,二次开发方便快捷。为医疗机构提…

哈工大计算机网络课程网络层协议之:网络层服务概述

哈工大计算机网络课程网络层协议之:网络层服务概述 文章目录 哈工大计算机网络课程网络层协议之:网络层服务概述网络层概述网络层核心功能—转发与路由网络层核心功能—连接建立网络层服务模型虚电路网络与数据报网络虚电路网络虚电路(VC)的具体实现VC转…