【Java 设计模式】行为型之命令模式

文章目录

    • 1. 定义
    • 2. 应用场景
    • 3. 代码实现
    • 结语

命令模式(Command Pattern)是一种行为型设计模式,用于将请求封装为对象,使得可以参数化客户端对象,并且能够排队、记录请求,以及支持撤销操作。在本文中,我们将深入研究Java中命令模式的定义、结构、使用场景以及如何在实际开发中应用。

1. 定义

命令模式是一种行为型设计模式,用于将请求封装为对象,使得可以参数化客户端对象,并且能够排队、记录请求,以及支持撤销操作。命令模式的核心思想是将请求发送者和接收者解耦,通过命令对象来封装请求。命令对象包含了执行请求的方法,通过这种方式实现了请求的发起和执行的解耦。命令模式通常包含四个主要角色:命令(Command)、具体命令(Concrete Command)、命令发送者(Invoker)、命令接收者(Receiver)。

  • 命令(Command): 声明了执行请求的接口
  • 具体命令(Concrete Command): 实现了命令接口,对具体的请求进行了封装
  • 命令发送者(Invoker): 负责调用命令对象来执行请求
  • 命令接收者(Receiver): 负责处理命令的执行

2. 应用场景

命令模式通常在以下场景中使用:

  • 需要将请求的发送者和接收者解耦:

    当需要将请求的发送者和接收者解耦,使得可以灵活地组合和配置命令时,可以使用命令模式

  • 支持撤销操作:

    当需要支持撤销操作,可以使用命令模式将每一次操作封装成一个命令对象,支持撤销操作

  • 支持事务操作:

    当需要支持事务操作,可以使用命令模式将一系列相关的操作封装成一个命令对象,保证这些操作要么全部执行成功,要么全部执行失败

3. 代码实现

下面通过一个简单的例子来演示命令模式的实现。假设有一个遥控器,我们可以通过命令模式实现对不同电器的控制。

命令 - 控制命令 Command

package com.cheney.demo;interface Command {void execute();
}

具体命令 - 开灯命令 LightOnCommand

package com.cheney.demo;class LightOnCommand implements Command {private Light light;public LightOnCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.turnOn();}
}

具体命令 - 关灯命令 LightOffCommand

package com.cheney.demo;class LightOffCommand implements Command {private Light light;public LightOffCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.turnOff();}
}

命令接收者 - 电灯 Light

package com.cheney.demo;class Light {public void turnOn() {System.out.println("开灯");}public void turnOff() {System.out.println("关灯");}
}

命令发送者 - 遥控器 RemoteControl

package com.cheney.demo;class RemoteControl {private Command command;public void setCommand(Command command) {this.command = command;}public void pressButton() {command.execute();}
}

客户端启动类 Main

package com.cheney.demo;public class Main {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();remoteControl.setCommand(lightOffCommand);remoteControl.pressButton();}
}

在上述例子中,Command 是命令接口,声明了执行请求的方法。LightOnCommandLightOffCommand 是具体命令,实现了命令接口,并封装了对电灯的控制操作。Light 是命令接收者,负责实际处理命令的执行。RemoteControl 是命令发送者,负责调用命令对象来执行请求。

在客户端中,我们使用命令模式实现了遥控器对电灯的控制。通过将控制命令封装成不同的命令对象,遥控器可以动态地切换控制的电器,实现了发送者和接收者的解耦。

结语

命令模式是一种用于将请求封装为对象,使得可以参数化客户端对象,并且能够排队、记录请求,以及支持撤销操作的设计模式。通过使用命令模式,可以实现发送者和接收者的解耦,提高系统的灵活性和可维护性。在实际开发中,命令模式常被用于实现事务操作、撤销操作、菜单操作等场景。通过合理使用命令模式,可以提高系统的可扩展性和可复用性。

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

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

相关文章

R基础语法

1.变量 命名规则: R语言中变量可以由字母,数字以及点号.或下划线_组成。以字母或点开头。不能以数字开头。一些特殊的符号不能在名称中出现,如%,$等。区分大小写,如name和Name是两个变量。 可用名称不可用名称a1tri…

vue3前端开发,如何引入element-plus前端框架及配置参数

vue3前端开发,如何引入element-plus前端框架及配置参数!这是一个简单的教程,帮助大家快速在自己的项目中引入element-plus框架。 主要是介绍的引入流程和参数的配置情况。 如图,这个就是elment-plus前端框架里面的一个主按钮展示。表示我们配…

NodeJs 第二十章 代理

在计算机网络中,代理是一种中间服务,能够代理用户与网络资源之间的通信。代理服务器可以缓存网页内容、过滤网络流量或隐藏用户的真实IP地址等功能。 在日常开发中,我们接触最多的是客户端发送ajax到服务端。但是服务端并不是 node &#xf…

pod 报错Failed to connect to github.com port 443

pod 报错Failed to connect to github.com port 443 1、排查代理问题1.1、查找网络代理1.2、修改 Git 的代理 2、排查DNS解析问题2.1、查找 ip地址2.2、修改 host 文件 1、排查代理问题 1.1、查找网络代理 打开 设置 --> 网络与Internet --> 查找代理 1.2、修改 Git …

k8s中服务器容器tcp连接数量优化

netty的http1服务器在运行一段时间后会无法提供服务,返回客户端socket hang up 使用apipost测试抓包显示三次握手后被reset 修改net/core/somaxconn 登录容器,cat /proc/sys/net/core/somaxconn显示128,对于一个服务器来说,这个…

第26章 内积继续深入讲解,一点叉乘

只要思想敢滑坡,办法总比想法多。 之前讲了内积的来源,现在继续讲在矩阵中为什么会有,对应坐标相乘的内积表现方式,还是需要复数的存在,现在就现在一个矩阵中讲,在一维的矩阵,这个矩阵就先全部…

Git提交大文件报错“remote: Please remove the file from history and try again. ”

如在使用Git过程中不小心将较大的二进制文件加入仓库,那么仓库大小很快就会超过规定的配额,在Push的时候会报下面的错误: remote: Powered by GITEE.COM [GNK-6.4] remote: error: File: c91e5de4f55bedd0669db01036fc131ea8e516ce 130.66 MB…

PLAN方法:解决 GAN 生成医学图像 Latent 空间中的隐私保护方法

PLAN方法:解决 GAN 生成医学图像 Latent 空间中的隐私保护方法 PLAN 原理StyleGAN 生成视网膜图k-SALSA 生成视网膜图PLAN方法 生成视网膜图 总结 PLAN 原理 论文:https://arxiv.org/abs/2307.02984 代码:https://github.com/perceivelab/P…

kingbase常用SQL总结之统计大小

概述 数据库运维中,我们需要总结一些常用的SQL语句,无论是日常巡检、故障排查或是死锁分析,都可以随时拿来用,提升工作效率,下面是一些常见的经典SQL或者是笔者自己工作过程中用到的常用的SQL,整理记录以备不时之需。…

SpringBoot 统计更多Api接口日志信息

第1步:基本配置了解 Further Reading : SpringBoot 统计API接口用时该使用过滤器还是拦截器? 第2步:丰富LogInterceptor(主体流程) 日志打印放afterCompletion是为了兼容异常场景也可以记录日志 import com.zhang…

【LeetCode27】 移除元素

27. 移除元素 快慢型双指针 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不…

vulhub之redis篇

CVE-2022-0543 | redis的远程代码执行漏洞 简介 CVE-2022-0543 该 Redis 沙盒逃逸漏洞影响 Debian 系的 Linux 发行版本,并非 Redis 本身漏洞, 漏洞形成原因在于系统补丁加载了一些redis源码注释了的代码 原理分析 redis一直有一个攻击面,就是在用户连接redis后,可以通过ev…

企业微信开发:本地运行一个页面应用

问题 在开发环境本地运行一个页面应用,将网页URL配置到企业微信的应用主页网址中,此时应用在企业微信中能够正常打开网页吗? 结论是:能够正常访问页面。 能够访问的前提 能够访问的前提条件,企业微信客户端所在的网…

界面控件DevExpress ASP.NET Data Grid组件 - 可快速处理各类型数据!(一)

由DevExpress开发的快速且功能完整的ASP.NET Web Forms的Data Grid组件,从全面的数据塑造和数据过滤选项到十多个集成数据编辑器,该套件提供了帮助用户构建极佳数据所需的一些,没有限制! P.S:DevExpress ASP.NET Web …

k8s--helm

什么是helm?在没有这个helm之前,deployment service ingress helm的作用 通过打包的方式,把deployment service ingress等打包在一块,一键式的部署服务,类似yum安装 官方提供的一个类似与安装仓库额功能,…

Linux C语言开发(十)vim基本操作

目录 一.什么是vim 二.vim的进入与退出 三.vim的基本模式 四.vim的命令行模式操作

SPA vs MPA vs PWA

1、单页面应用程序(SPA) ① 什么是 SPA SPA 全称为 Single-Page Application,表示单页面应用程序。 也就是说只有一个 HTML 文件的 Web 应用,我们通过 Vue 开发的项目其实就是典型的 SPA应用 在单页面应用程序中,我…

C语言——结构体讲解

目录 一、结构体类型的声明 二、结构体变量的定义和初始化 三、结构体的重命名 四、结构体的自引用 五、结构体内存对齐 六、结构体传参 七、结构体实现位段 7.1 什么是位段 7.2 位段的声明和使用 7.3 位段的空间大小计算 7.4 位段的内存分配 7.5 位段的跨平…

计算机网络-物理层基本概念(接口特性 相关概念)

文章目录 总览物理层接口特性星火模型给出的相关概念解释(仅供参考) 总览 求极限传输速率:奈氏准则,香农定理(背景环境不一样) 编码:数据变成数字信号 调制:数字信号变成模拟信号 信…

Elasticsearch:2023 年 Lucene 领域发生了什么?

作者:来自 Elastic Adrien Grand 2023 年刚刚结束,又是 Apache Lucene 开发活跃的一年。 让我们花点时间回顾一下去年的亮点。 社区 2023 年,有: 5 个次要版本(9.5、9.6、9.7、9.8 和 9.9),1 …