命令模式(请求与具体实现解耦)

目录

前言

UML

plantuml

类图

实战代码

模板

Command

Invoker

Receiver

Client


前言

命令模式解耦了命令请求者(Invoker)和命令执行者(receiver),使得 Invoker 不再直接引用 receiver,而是依赖于抽象的命令接口。具体的命令类则直接引用 receiver,通过调用 receiver 的方法来执行命令。

解耦之后,具体命令的增删改不再影响 Invoker,同时,抽象出来的命令请求还能队列化,从而实现撤销和重试功能,或做排列组合合成复杂的命令。

在 Invoker 中,也体现了桥接模式的思想,将命令的抽象和具体的实现分离,使 Invoker 中命令的添加和扩展更加简单。不过具体的命令类并不直接实现处理逻辑,而是交给了 receiver 来实现,这也是命令模式和桥接模式最主要的区别。

UML

plantuml

@startuml
'https://plantuml.com/class-diagraminterface Command {+ execute() : void
}class CommandA {- receiver : Receiver+ CommandA(Receiver)+ execute() : void
}class CommandB {- receiver : Receiver+ CommandB(Receiver)+ execute() : void
}class Receiver {+ executeA() : void+ executeB() : void
}class Invoker {- commands : List<Command>+ addCommand(Command) : void+ execute(Command) : void+ executes() : void
}class Client {}Command <|.. CommandA
Command <|.. CommandBCommandA "1" --> "1" Receiver
CommandB "1" --> "1" ReceiverInvoker "1" --> "n" CommandClient ..> Invoker
Client ..> Command@enduml

类图

实战代码

模板

Command

public interface Command {void execute();
}public class ConcreteCommand1 implements Command {private Receiver receiver;public ConcreteCommand1(Receiver receiver) {this.receiver = receiver;}public void execute() {receiver.execute1();}
}public class ConcreteCommand2 implements Command {private Receiver receiver;public ConcreteCommand2(Receiver receiver) {this.receiver = receiver;}public void execute() {receiver.execute2();}
}

Invoker

public class Invoker {private List<Command> commands = new ArrayList<Command>();public void addCommand(Command command){commands.add(command);}public void execute(Command command){command.execute();}public void executes(){for(Command command : commands){command.execute();}commands.clear();}
}

Receiver

public class Receiver {public void execute1() {System.out.println("execute1.");}public void execute2() {System.out.println("execute2.");}
}

Client

public class Test {public static void main(String[] args) {Receiver receiver = new Receiver();Invoker invoker = new Invoker();invoker.execute(new Command1(receiver));invoker.addAction(new Command1(receiver));invoker.addAction(new Command2(receiver));invoker.executes();}
}

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

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

相关文章

msvcp100.dll是什么东西?电脑msvcp100.dll丢失的六种解决方法

最近&#xff0c;我在电脑上打开一款软件时&#xff0c;遇到了一个问题&#xff1a;找不到msvcp100.dll丢失问题&#xff0c;为了解决这个问题&#xff0c;我进行了深入的学习和研究&#xff0c;并在此分享msvcp100.dll丢失的解决方法。 一&#xff0c;msvcp100.dll是什么&…

Visual Studio QT6 工程引入组件模块,例如:QtXml

QT 工程引入 QtXml QT 版本 6.6.1 Visual Studio 版本 Microsoft Visual Studio Community 2022 (64 位) - Current 版本 17.7.5 打开 Visual Studio 项目工程选择 工具栏 - 扩展 - QT VS Tools -Qt Project Settings 勾选 xml 后点击确定 点击应用即可 注意&#xff1a;配置环…

Apache Dolphinscheduler - 执行工作流却没有创建任务实例分析

问题描述 最近碰到一个奇怪的问题&#xff0c;DS 创建工作流成功&#xff0c;但是一旦执行&#xff0c;始终在转&#xff0c;而且没有任何执行的痕迹&#xff0c;后来到数据库一查发现压根没创建任务实例。 我们都知道一个工作流里面可以挂多个任务节点&#xff0c;执行工作流…

Python 全栈体系【四阶】(十九)

第五章 深度学习 一、基本理论 4. 神经网络的改进 4.3 循环神经网络 4.3.1 标准 CNN 模型的不足 假设数据之间是独立的。标准 CNN 假设数据之间是独立的&#xff0c;所以在处理前后依赖、序列问题&#xff08;如语音、文本、视频&#xff09;时就显得力不从心。这一类数据…

iOS - Runtime-isa详解(位域、union(共用体)、位运算)

文章目录 iOS - Runtime-isa详解&#xff08;位域、union&#xff08;共用体&#xff09;、位运算&#xff09;前言1. 位域介绍1.1 思路1.2 示例 - 结构体1.3 示例 - union&#xff08;共用体&#xff09;1.3.1 说明 1.4 结构体 对比 union&#xff08;共用体&#xff09; 2. a…

【前端】代码案例

1.猜数字 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>猜数字</title> </head> <…

idea运行项目没反应【debug和run灰色】

解决方法 File->Settings->Plugins->groovy 将groovy勾选的√去掉&#xff0c;保存再重新启动idea即可。 啊啊啊码

【微服务】认识Dubbo+基本环境搭建

认识Dubbo Dubbo是阿里巴巴公司开源的一个高性能、轻量级的WEB和 RPC框架&#xff0c;可以和Spring框架无缝集成。Dubbo为构建企业级微服务提供了三大核心能力&#xff1a; 服务自动注册和发现、面向接口的 远程方法调用&#xff0c; 智能容错和负载均衡官网&#xff1a;https…

RK3568平台 iperf3测试网络性能

一.iperf3简介 iperf是一款开源的网络性能测试工具&#xff0c;主要用于测量TCP和UDP带宽性能。它可以在不同的操作系统上运行&#xff0c;包括Windows、Linux、macOS等。iperf具有简单易用、功能强大、高度可配置等特点&#xff0c;广泛应用于网络性能测试、网络故障诊断和网…

SpringBoot集成Solr全文检索

SrpingBoot 集成 Solr 实现全文检索 一、核心路线 使用 Docker 镜像部署 Solr 8.11.3 版本服务使用 ik 分词器用于处理中文分词使用 spring-boot-starter-data-solr 实现增删改查配置用户名密码认证使用 poi 和 pdfbox 组件进行文本内容读取文章最上方有源码和 ik 分词器资源…

【晴问算法】入门篇—字符串处理—单词数

题目描述 给定一堆用空格隔开的英文单词&#xff0c;统计单词个数。输入描述 一堆英文单词&#xff0c;每个单词不超过10个字符&#xff0c;且仅由大小写字母组成;每两个单词之间用一个空格隔开&#xff0c;整个字符串的长度不超过1000。输出描述 输出一个整数&#xff0c;表示…

视频汇聚平台EasyCVR启用图形验证码之后调用login接口的操作方法

视频综合管理平台EasyCVR视频监控系统支持多协议接入、兼容多类型设备&#xff0c;平台可以将区域内所有部署的监控设备进行统一接入与集中汇聚管理&#xff0c;实现对监控区域的实时高清视频监控、录像与存储、设备管理、云台控制、语音对讲、级联共享等&#xff0c;在监控中心…

【网络爬虫】(2) requests模块,案例:网络图片爬取,附Python代码

1. 基本原理 1.1 requests 模块 requests 是 Python 中一个非常流行的 HTTP 客户端库&#xff0c;用于发送所有的 HTTP 请求类型。它基于 urllib&#xff0c;但比 urllib 更易用。 中文文档地址&#xff1a;Requests: 让 HTTP 服务人类 — Requests 2.18.1 文档 &#xff0…

OpenHarmony 源码解析之SystemUi—Statusbar(TS)

作者&#xff1a;董伟 简介 SystemUI应用是OpenHarmony中预置的系统应用&#xff0c;为用户提供系统相关信息展示及交互界面&#xff0c;包括系统状态、系统提示、系统提醒等&#xff0c;例如系统时间、电量信息。 本文主要分析batterycomponent、clockcomponent、wificompo…

[Windows常用软件] word 复制粘贴报错修复

背景 在word 内 ctrlv 会报这个错。 microsoft visual basic MathPage.Wll 运行时错误 网上查了一下是 mathtype 导致的&#xff0c;应该是我之前卸载 mathtype 没有卸载干净导致的。 解决方案 参考知乎里面的一个回答解决的&#xff1a;https://www.zhihu.com/question/37…

高防服务器、高防IP、高防CDN的工作原理是什么

高防IP高防CDN我们先科普一下是什么是高防。“高防”&#xff0c;顾名思义&#xff0c;就犹如网络上加了类似像盾牌一样很高的防御&#xff0c;主要是指IDC领域的IDC机房或者线路有防御DDOS能力。 高防服务器主要是比普通服务器多了防御服务&#xff0c;一般都是在机房出口架设…

网络七层模型之网络层:理解网络通信的架构(三)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

centos 7安装pgsql14

参考 yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm终端直接运行&#xff1a;yum install -y postgresql14-server 1. 初始化数据库 使用yum安装后&#xff0c;会在系统中创建一个postgres的无密码…

【快速解决】谷歌浏览器驱动的安装及selenium的安装

目录 快速安装Selenium 快速下载对应谷歌驱动 找不到对应版本号的解决方法 快速安装Selenium 安装 Selenium 环境就用下面的代码进行安装&#x1f447;&#x1f447;&#x1f447;&#x1f447;&#x1f447; pip install selenium3.141.0 快速下载对应谷歌驱动 点击这个链接…

关于RPC

初识RPC RPC VS REST HTTP Dubbo Dubbo 特性&#xff1a; 基于接口动态代理的远程方法调用 Dubbo对开发者屏蔽了底层的调用细节&#xff0c;在实际代码中调用远程服务就像调用一个本地接口类一样方便。这个功能和Fegin很类似&#xff0c;但是Dubbo用起来比Fegin还要简单很多&a…