聊聊设计模式——命令模式

news2024/10/7 11:31:44

目录

命令模式定义

优点

缺点

命令模式结构说明

工作流程

代码练习

应用场景

本质

涉及的设计原则

相关设计模式

开源框架中的应用


命令模式定义

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

                                                                                                                       `

优点

  1. 解耦:命令模式将命令的发起者和执行者解耦,使得命令对象充当中间人角色。

  2. 可扩展性:您可以轻松添加新的命令类,以实现新的操作,而无需修改现有的客户端代码。

  3. 支持撤销和重做:通过保存命令的历史记录,可以支持撤销和重做操作。

  4. 支持事务:命令模式可以用于支持事务,将一系列操作封装成一个命令对象,然后一次性执行或回滚。

缺点

  1. 类膨胀:命令模式可能会导致类的数量增加,因为每个具体命令类都需要一个对应的类。

  2. 复杂性:对于简单的命令,实现命令模式可能会引入不必要的复杂性。

命令模式结构说明

  1. 命令接口(Command Interface):定义了执行命令的方法。

  2. 具体命令类(Concrete Command):实现了命令接口,它包含了对接收者的引用,以及实际执行命令的逻辑。

  3. 接收者类(Receiver):负责执行命令所指定的操作。

  4. 调用者类(Invoker):负责存储命令对象并调用命令对象的执行方法。

工作流程

  1. 客户端创建一个具体命令对象,并设置其接收者。

  2. 客户端将命令对象传递给调用者(Invoker)。

  3. 调用者将命令对象存储起来。

  4. 在需要执行命令的时候,调用者调用命令对象的执行方法。

  5. 命令对象执行实际的操作,将请求传递给接收者执行。

代码练习

命令模式是行为型设计模式,和结构型设计模式中的组合模式类似,都有很强的特定场景要求。命令模式的应用场景,是用来控制 命令的执行,比如,异步、延迟、排队执行命令、撤销重做命令、存储命令、给命令记录日志等等,这才是命令模式能发挥独一无二作用的地方。

1.创建命令接口,定义了执行命令的方法execute()。

public interface Command {
    void execute();
}

2.创建具体的命令类,包含接收者的引用,以及实际执行命令的逻辑。

/*
具体的命令类包含了接收者,调用接收者具体的操作方法
 */
public class ConcreteCommand implements Command{
​
    private Receiver receiver;
​
    public ConcreteCommand(Receiver receiver) {
        this.receiver = receiver;
    }
​
    @Override
    public void execute() {
        receiver.action();
    }
}

3.创建接收者,负责执行命令。

public class Receiver {
    public void action(){
        System.out.println("达成命令...");
    }
}

4.创建调用者,负责发起调用,传达命令。

public class Invoker {
    private Command command;
​
    public void setCommand(Command command) {
        this.command = command;
    }
​
    public void executeCommand(){
        command.execute();
    }
}

5.客户端实现:

public class CommandClient {
    public static void main(String[] args) {
        Receiver receiver = new Receiver();
        Command command = new ConcreteCommand(receiver);
​
        Invoker invoker = new Invoker();
        invoker.setCommand(command);
        invoker.executeCommand();
    }
}

应用场景

  1. 当需要将请求的发送者和接收者解耦时,命令模式非常有用。它允许您将请求封装成独立的命令对象,从而可以方便地添加、修改或撤销命令。

  2. 当需要支持事务(Transaction)或撤销(Undo)操作时,命令模式可以有效地管理操作历史。

  3. 当需要实现任务调度或队列执行操作时,命令模式可以用于构建命令队列。

本质

命令模式的本质是将请求封装成对象,从而允许您参数化客户端以及将请求排队、记录请求和支持撤销操作。

涉及的设计原则

  1. 开闭原则(Open-Closed Principle):命令模式遵循开闭原则,因为它允许您添加新的命令类而不需要修改现有的客户端代码。

相关设计模式

  • 命令模式通常与其他模式结合使用。例如,可以将命令模式与责任链模式结合使用来构建命令处理链,或者与备忘录模式结合使用以支持撤销和重做操作。

开源框架中的应用

Java中的Swing框架**:Swing是Java图形用户界面(GUI)工具包,其中的事件处理机制使用了命令模式。事件源(如按钮)会生成相应的命令对象(如ActionEvent),然后通过注册的命令监听器来执行相应的操作。

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

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

相关文章

【内网穿透】隐蔽通信隧道技术之建立ICMP隧道

一、基础知识 1、概述 一般的网络通信、先在两台机器之间建立 TCP 连接,然后进行正常的数据通信。在知道P 地址的情况下、可以直接发送报文:如果不知道 P 地址,就需要将域名解析成P 地址。在实际的网络中、通常会通过各种边界设备、软/硬件防火墙甚至人…

React(react18)中组件通信06——redux-toolkit + react-redux

React(react18)中组件通信06——redux-toolkit react-redux 1 前言1.1 redux 和 react-redux1.2 关于redux-toolkit1.2.1 官网1.2.2 为什么要用Redux Toolkit? 1.3 安装 Redux Toolkit1.4 Redux Toolkit相关API 2. 开始例子——官网例子2.1 …

【Windows】 Windows 10 等系统如何关闭文件夹预览模式

在Windows系统进行文件操作时,由于屏幕尺寸有限,有时感觉文件夹右侧的预览模式很占位置,因此想预览时打开,想关闭时就关闭。 以下是两种解决方案: 方案一:彻底关闭预览模式 方案二:可通过快捷键…

Leetcode 1379.找出克隆二叉树中的相同节点

给你两棵二叉树,原始树 original 和克隆树 cloned,以及一个位于原始树 original 中的目标节点 target。 其中,克隆树 cloned 是原始树 original 的一个 副本 。 请找出在树 cloned 中,与 target 相同 的节点,并返回对…

JDK 21 — JDK 21发布及多项新特性!

一、JDK 21 新特性说明 JDK 21 已经于 2023 年 9 月 19 日正式发布,Java 21 / JDK 21 已正式 GA,此版本是继 JDK 17 后的长期支持版本 (LTS),Oracle 将为其提供至少八年的技术支持和更新。本文总结了 JDK 21 发布的新特性。 二、JDK 21 正式…

基于PyTorch3D的GeoAI实现【ESRI】

Esri 的 AI 原型团队正在以 PyTorch3D API 的一系列 PR 的形式分享一些功能增强功能。 这些功能支持 obj 格式的网格的输入/输出 (I/O),该网格具有多个纹理和代表真实世界几何形状的顶点坐标。 对于 GeoAI 任务,这些功能支持跨网格分割管道的任务&#x…

第36节——useDebugValue+React Developer Tools——了解

一、概念 勾住”React开发调试工具中的自定义hook标签,让useDebugValue勾住的自定义hook可以显示额外的信息。useDebugValue的目的是“在react开发者工具自定义hook标签中显示额外信息”,方便我们“一眼就能找到”对应的自定义hook。useDebugValue(valu…

信息安全:网络物理隔离技术原理与应用.

信息安全:网络物理隔离技术原理与应用. 随着网络攻击技术不断增强,恶意入侵内部网络的风险性也相应急剧提高。满足内外网信息及数据交换需求,又能防止网络安全事件出现的安全技术就应运而生了,这种技术称为“物理隔离技术” 基本原…

如何用Postman做接口自动化测试

前言 什么是自动化测试 把人对软件的测试行为转化为由机器执行测试行为的一种实践。 例如GUI自动化测试,模拟人去操作软件界面,把人从简单重复的劳动中解放出来。 本质是用代码去测试另一段代码,属于一种软件开发工作,已经开发完…

应用开发平台集成工作流系列之12——流程导航功能设计与实现

背景 流程模板主要是用于流程建模的,对于业务用户而言,需要一个业务流程的导航页,分门别类展示业务流程清单,用于发起新的流程。 并且需要根据当前用户过滤,只显示有权限发起的流程。 业务流程类别的处理 一个企业的…

OCR -- 文本检测

目标检测: 不仅要解决定位问题,还要解决目标分类问题,给定图像或者视频,找出目标的位置(box),并给出目标的类别; 文本检测: 给定输入图像或者视频,找出文本的…

基于 SpringBoot+Vue 的口腔管理平台,附源码,数据库

第一章 简介 本项目,是基于 Java SpringBoot 开发的,主要功能包括首页、个人中心、病例就诊信息管理、复查提醒管理、预约挂号管理、我的收藏管理、订单管理,前台首页;首页、牙齿保健产品、牙齿保护小知识、留言反馈、个人中心、…

React(react18)中组件通信05——redux ➕ react-redux(含数据共享)

React(react18)中组件通信05——redux ➕ react-redux(含数据共享) 1. 前言1.1 React中组件通信的其他方式1.2 介绍React-Redux1.2.1 简单介绍React-Redux1.2.2 官网 1.3 安装react-redux 2. 简单改写redux的例子2.1 提供store2.2…

【从0学习Solidity】37. 数字签名 Signature

【从0学习Solidity】37. 数字签名 Signature 博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。关注我们的主页&#xff0…

提示计算机丢失msvcp140.dll怎么办,缺少msvcp140.dll一键修复

在计算机使用过程中,我们可能会遇到各种稀奇古怪的问题。其中,msvcp140.dll 文件丢失算是比较常见的一种。那么,究竟什么是 msvcp140.dll 文件?它为什么会丢失?我们又该如何解决这个问题呢?本文将围绕这些问…

向量数据库库Milvus Cloud2.3 技术选型中性能、成本、扩展性是重点

技术选型中性能、成本、扩展性是重点 对于向量数据库来说,用户最关心的莫过于性能、成本和扩展性。 Milvus 2.x 从 Day 1 开始就将扩展性作为设计的第一优先级,在众多用户环境中落地了十亿至百亿级别场景。不止如此,对于 Milvus 来说,扩展性不仅仅意味着支持百亿级别向量,…

vue指令(代码部分)

注&#xff1a;此部分为学习uni-app时接触到的vue <template><view><view>当前标题&#xff1a;{{title}}</view><view> {{num}}</view><view>{{arr[2]}}</view><view>{{obj}}</view><view>{{obj.name}}&l…

导览软件定制开发方案

随着智能手机的普及和人们对文化、旅游等方面的需求不断增加&#xff0c;导览软件市场前景广阔。本文将围绕导览软件定制开发方案展开&#xff0c;包括以下部分&#xff1a; 一、行业现状及市场需求 导览软件市场发展迅速&#xff0c;各类导览软件层出不穷。通过对市场…

价值1000的情感爆文写作prompt,助你写出10万+阅读微信爆文

原文&#xff1a;价值1000的情感爆文写作prompt&#xff0c;助你写出10万阅读微信爆文 - 知乎 是否经常看到一些自媒体晒出这样的图片&#xff1f; 或者是这样的10w的阅读文章 那么这是真实能赚钱的吗&#xff1f;还是自媒体夸大其说&#xff0c;吸引流量。 我们先简单了解什…

ElementUI之登陆+注册->饿了吗完成用户登录界面搭建,axios之get请求,axios之post请求,跨域,注册界面

饿了吗完成用户注册登录界面搭建axios之get请求axios之post请求跨域 1.饿了吗完成用户注册登录界面搭建 将端口号8080改为8081 导入依赖&#xff0c;在项目根目录使用命令npm install element-ui -S&#xff0c;添加Element-UI模块 -g&#xff1a;将依赖下载node_glodal全局依…