设计模式之命令模式(行为型)

news/2024/4/28 0:50:46/文章来源:https://blog.csdn.net/qq_53316135/article/details/127505199

1、命令模式定义

命令模式(Command),将一个请求封装为一个对象,请求以命令的形式包裹在对象中,传递给调用对象,调用对象寻找可以处理该命令的合适的对象,并将命令传递给相应的对象,该对象执行命令。

  • 命令模式本质是对命令进行封装,将发出命令的责任和执行命令的责任分开
  • 每个命令都是一个操作,一方发出请求要执行操作,另一方接收请求并执行操作
  • 命令模式使请求本身成为一个对象,这个对象可以和其他对象一样被存储和作为参数传递

2、命令模式结构

在这里插入图片描述

Command:声明执行命令的接口

/*** 执行命令*/
public interface Command {/*** 执行命令*/void execute();}

ConcreteCommand:具体的命令,调用接收者执行对应的操作

import lombok.Data;import java.util.List;/*** 将一个接收者绑定于一个动作,调用接收者执行相应的操作*/
@Data
public class ConcreteCommand implements Command {/*** 命令接收对象*/protected List<Receiver> receiverList;@Overridepublic void execute() {receiverList.forEach(Receiver::action);}
}

Invoker:要求该命令执行这个请求

import lombok.Data;/*** 要求该命令执行这个请求*/
@Data
public class Invoker {/*** 要执行的命令*/private Command command;/*** 执行当前命令*/public void executeCommand() {command.execute();}}

Receiver:命令接收者,知道如何实施与执行一个与请求相关的操作

import lombok.Data;/*** 接收者,执行一个与请求相关的操作,任何类都可以作为一个接收者*/
@Data
public class Receiver {private String name;public void action() {System.out.println(name + " 执行了请求~");}}

调用方代码

import java.util.ArrayList;
import java.util.List;public class CommandClient {public static void main(String[] args) {// 命令的接收者List<Receiver> receiverList = new ArrayList<>();Receiver receiver = new Receiver();receiver.setName("张三");Receiver receiver2 = new Receiver();receiver2.setName("李四");receiverList.add(receiver);receiverList.add(receiver2);// 具体命令ConcreteCommand concreteCommand = new ConcreteCommand();concreteCommand.setReceiverList(receiverList);// 要执行的命令Invoker invoker = new Invoker();invoker.setCommand(concreteCommand);//执行具体命令invoker.executeCommand();}}

3、命令模式优点

  • 命令模式可以较容易的设计一个命令队列,在需要的情况下,可以较为容易的将命令记入日志
  • 允许接收请求的一方决定是否要否决请求,可以容易的实现对请求的撤销和重做,调用统一方法可以实现不同的功能
  • 由于新加入的具体命令类不影响其它的类,所以增加新的具体命令较为容易
  • 命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开,降低对象之间的耦合度

4、命令模式缺点

命令模式针对每一个模式都要设计一个具体的命令类,某些系统可能需要大量的具体命令类,这将会影响命令模式的使用

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

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

相关文章

creo草绘工程图标注字体大小、加粗设置

刚接触creo&#xff0c;字体又小又细&#xff0c;这的眼睛受不了&#xff01; 在网上找了很久&#xff0c;发现字体设置非常麻烦&#xff0c;我先是调整了字体的大小&#xff0c;但是字体很细&#xff0c;于是只能通过设置字体来改变粗细&#xff0c;实在找不到设置字体加粗的…

jenkins简介

参考链接&#xff1a;jenkins_L向上z的博客-CSDN博客_jenkins Jenkins详细教程_zhishidi的博客-CSDN博客_jenkins jenkins最主要的作用是什么&#xff1f; - 知乎 1.背景   在实际开发中&#xff0c;我们经常要一边开发一边测试&#xff0c;当然这里说的测试并不是程序员对…

golang-gin框架快速入门--推荐

1.设置golangd的配置&#xff1b; go env :命令后&#xff0c;获取安装gin的国内代理&#xff0c;解决访问国外网站下载包慢的问题 1.1.检查golangd的设置 检查上述三个地方的设置&#xff0c;看看是否正确&#xff0c;重点是工modules这个地方设置&#xff0c;查看是否启用了国…

git实用操作:git rebase -i 合并多个 commit

我们开发的过程中&#xff0c;可能会有多次的修补提交&#xff0c;就会出现多条提交记录和备注信息&#xff0c;此时我们可以使用 git rebase -i来合并多个commit&#xff0c;以简化提交记录 1.合并最近的 4 次提交纪录&#xff0c;执行&#xff1a; git rebase -i HEAD~42.自…

今天不想上班

无语 - - 为什么项目迁移了 算了 不需要脑子思考复杂的 反正我干就是了&#xff0c;领了工资干了活&#xff0c;我菜那是我的事。 顺便学习一下好了。 可能我基础不太行吧。 关于我和同事新一起合作写一个项目 老板让我优化代码后老板满意了同事被封装的痛苦了。 现在…

TortoiseSVN下载安装及问题总结

文章目录TortoiseSVN介绍下载安装问题使用首先将客户端与服务器进行连接检出提交TortoiseSVN介绍 TortoiseSVN是一个开源的版本控制系统&#xff0c;也就是说Subversion管理者随着时间而改变的数据。这些数据放置在任何一个中央资料档案库&#xff08;repository&#xff09;中…

中国定制家具行业深度调研及投资前景预测报告

欧派家居VS索菲亚:家具商业的布局史 家具产品的特性决定了家具产业在经济和社会中的重要地位。随着经济的不断发展&#xff0c;家具行业也发展迅速。目前&#xff0c;欧派家居和索菲亚是国内家具行业的龙头企业主。 2.家具企业布局及经营状况: ——家具经营类型:索菲亚、欧派…

Apollo星火计划学习笔记第四讲1——Apollo高精地图模块

Apollo学习笔记零、目录一、高精地图的作用1.1 相对于传统地图二、高精地图介绍2.1 高精地图构成2.2 高精地图制作2.2.1 地图采集2.2.2 地图制作2.2.3 地图标注工具2.2.4 地图保存三、Apollo高精度地图3.1 高精地图目录结构3.2 高精地图格式3.3 Apollo高精地图API接口四、实践案…

【Gateway】统一网关Gateway学习记录

目录 网关能干什么 网关的技术实现 搭建网关服务 网关作用流程图 路由断言工厂&#xff08;Route Predicate Factory&#xff09; gateway中有三种过滤器&#xff1a; 1. 默认过滤器&#xff08;DefaultFiter&#xff09; 2. 路由过滤器&#xff08;GatewayFilter&…

3. Longest Substring Without Repeating Characters (无重复字符的最长子串)滑动窗口

文章目录问题英文中文代码小白的码大佬的码知识点unordered_set 容器具有以下几个特性&#xff1a;总结问题 英文 3. Longest Substring Without Repeating Characters (无重复字符的最长子串) 中文 代码 小白的码 #include <iostream> #include <string> #…

Terraform 基础 申请阿里云资源

之前&#xff0c;资源都定义好了&#xff0c;现在就是去申请资源了。 申请这些资源就需要使用terraform的命令行了&#xff0c;开始初始化后端&#xff0c;后端是有存储文件的&#xff0c;默认情况下是在本地存储的&#xff0c;然后会多一些文件。 &#xff08;下载插件&#x…

在python中安装gensim包(为了使用LDA)

LDA是英文“Latent Dirichlet Allocation”的缩写&#xff0c;意思是隐含狄利克雷分布&#xff0c;是一种主题模型&#xff08;topic model&#xff09;&#xff0c;它可以将文档集中每篇文档的主题以概率分布的形式给出。 gensim包中有LDA的一种实现。 本文介绍gensim包的安…

神经网络中的算法-梯度下降算法

目录 一、概述 二、算法思想 1、一维 2、多维 三、梯度下降类型 1、批量梯度下降算法 2、随机梯度下降算法 3、小批量梯度下降算法 一、概述 梯度下降法&#xff08;Gradient descent &#xff09;是一个一阶最优化算法&#xff0c;通常也称为最陡下降法 &am…

NetworkManager nmcli ipv4 静态ip 笔记221025

nmcli connection modify 可以修改现有连接 con 可以写成 c 到 connection 之间的字段mod 可以写成 m 到 modify 之间的字段nmcli connection modify nmcli connec modify nmcli conne modif nmcii conn modi nmcli con mod nmcli co mo nmcli c m nmcli c modify nmcli conne…

购物中心智能管理系统该如何选择

快鲸智慧楼宇系统作为新一代数智化商管系统&#xff0c;以实际业务场景出发构建产品逻辑&#xff0c;并在传统商管系统基础上&#xff0c;拥有独家的商业大数据加持&#xff0c;同时嵌入了BI智能分析工具&#xff0c;打造了一个招商营运场景的数智化系统&#xff0c;将“人的经…

[C++] 初接触 泛型编程—— C++ 模板分析

泛型编程 C中引入了重载的概念&#xff0c;使得可以编写多个函数名相同但参数、返回值不同的函数&#xff0c;例如&#xff1a; 相同的函数名可以传入不同的参宿&#xff0c;进而调用不同的函数 但&#xff0c;即使有了重载&#xff0c;相同功能的函数 还要分别对不同的类型进…

Python之numpy数组篇(下)

目录 一、数组排序 1、概念 2、升序&#xff0c;最大、最小值 3、原地、横向排序 二、数组内积运算 1、概念 2、代码例子 三、访问数组元素 1、使用介绍 2、行列直接访问 3、切片 4、行列访问扩展 四、数组对函数运算的支持 1、概念 2、例子 五、改变数组形状 1…

1.3.3系统调用

文章目录为什么引入系统调用什么是系统调用系统调用和库函数的区别系统调用的背后为什么引入系统调用 为了防止这样情况的发生&#xff0c;就是防止进程能够随意的去调用我们的系统资源&#xff0c;操作系统提供了系统调用的功能&#xff0c;用户进程想要使用打印机这种共享资源…

12_Vue事件总结

事件总结 事件修饰符连携 准备工作 html <!-- 定义一个容器 --><div class="app"><!-- 事件修饰符连携 --><div class="box" @click="toBaidu"><a href="https://www.baidu.com" @click.stop="toBaid…

Java代码审计前置知识——SpringMVC基础

目录 (一&#xff09;回顾MVC 1.1 什么是MVC Model&#xff08;模型&#xff09; View&#xff08;视图&#xff09; Controller&#xff08;控制器&#xff09; 1.2 Model1时代 1.3 Model2时代 总结 1.4 回顾Servlet 0x01 新建一个Maven工程当做父工程,pom依赖 0x0…