《设计模式》之命令模式

news2024/11/26 23:36:43

文章目录

    • 1、定义
    • 2、动机
    • 3、类结构
    • 4、优缺点
    • 5、总结
    • 6、代码实现(C++)

1、定义

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

2、动机

  1. 在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合——比如需要对行为进行“记
    录、撤销/重(undo/redo)、事务”等处理,这种无法抵御变化的紧耦合是不合适的。
  2. 在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。

3、类结构

在这里插入图片描述
Command类:命令类抽象基类,声明拥有执行操作的接口。
ConcreteCommand类:具体的命令类,将一个接收者与一个命令动作进行绑定,实现Command类声明的执行操作的接口。
Client:创建一个具体的命令对象,并可设置其接收者。
Invoker:调用命令对象执行请求
Receiver:知道如何实施和执行一个请求相关的操作。任何类都可能作为接收者。

4、优缺点

优点:
1)命令模式将调用操作的请求对象与知道如何实现该操作的接收对象解耦。
2)具体命令角色可以被不同的请求者角色重用。
3)你可将多个命令装配成一个复合命令。
4)增加新的具体命令角色很容易,因为这无需改变已有的类。

5、总结

  1. Command模式分根本目的在于将“行为请求者”与“行为实现者”解耦,在面向对象语言中,常见的实现手段是“将行为抽象为对象”。
  2. 实现Command接口的具体命令对象ConcreteCommand有时候根据需要可能会保存一些额外的状态信息。通过使用
    Composite模式,可以将多个“命令”封装为一个“复合命令”MacroCommand。
  3. Command模式与C++中的函数对象有些类似。但二者定义行为接口的规范有所区别:Command以面向对象中的“接口实现”来定义行为接口规范,更严格,但有性能损失;C++函数对象以函数签名来定义行为接口规范,更灵活,性能更高。

6、代码实现(C++)

命令模式源代码实现

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

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

相关文章

虚拟内存和物理内存:概念、原理和应用

目录 概述1. 概念2. 原理3. 设计寻位原理4. 应用场景结论 概述 当你使用计算机时,内存是一个非常重要的资源。它用于存储正在运行的程序和数据,确保系统的正常运行。在计算机系统中,存在着虚拟内存和物理内存的概念,它们共同协作…

Docker Gitlab Container Registry配置

文章目录 前言一、Registry是什么二、步骤配置gitlab.rb文件修改docker-compose.yaml文档验证推送镜像 总结 前言 找了很多资料包括官网1都没有发现比较清楚的配置registry的方法,自己摸索了半天发现其实通过简单设置就能够配置好Container Registry。 之所以在题…

【Docker】3.Docker Registry

文章目录 Docker RegistryDocker Registry CommandImage Command NginxNginx System installNginx Config Container CommandCreate My DegistryBusyBox腾讯云镜像仓库搭建 Docker Registry 镜像仓库负责存储、管理、分发镜像,并且提供了登录认证的能力&#xff0c…

LeetCode_二叉树_DFS_中等_129.求根节点到叶节点数字之和

目录 1.题目2.思路3.代码实现(Java) 1.题目 给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数字:例如,从根节点到叶节点的路径 1 -> 2 -> …

【计算机网络】IP 地址处理函数

目录 1.struct sockaddr_in的结构 2.一般我们写的结构 3.常见的“点分十进制” 到 ” uint32_t 的转化接口 3.1. inet_aton 和 inet_ntoa (ipv4) 3.2. inet_pton 和 inet_ntop (ipv4 和 ipv6) 3.3. inet_addr 和 inet_network 3…

人工智能-深度学习-科研神器推荐

根据知乎问题 有没有什么可以节省大量时间的 Deep Learning 效率神器? 的回答,筛选整理出一些深度学习科研神器。包括参数优化、数据可视化、模型部署蒸馏剪枝等。收录到 人工智能-深度学习-科研神器推荐https://​www.webhub123.com/#/home/detail?p4O…

vue监听缓存数据(localStorage)

方法:可以重写localStorage的setItem方法,当调用setItem方法设置新值的时候,会new Event(‘setItemEvent’) 用window.dispatchEvent()这个方法来派发一个事件,让window去监听 以下demo实现的是 一个页面获取诗句 然后将获取的数据…

【P51 】JMeter 聚合报告(Aggregate Report)

文章目录 一、聚合报告(Aggregate Report)参数说明二、准备工作三、测试计划设计 一、聚合报告(Aggregate Report)参数说明 可以查看事务或者取样器在某个时间范围内执行的汇总结果 使用场景:用于评估测试结果 使用…

2023-06-07 stonedb-包含内连接外连接派生表in子查询和聚合-查询结果错误-分析问题的思路

摘要: 最近在处理stonedb的一个包含内连接包含内连接外连接派生表in子查询和聚合的查询出错的问题, 逻辑非常复杂, 包含的操作符非常多. 本文首先从顶层设计出发, 指出如何分析如此复杂的问题。 查询SQL: SELECTB.company_id,上划日 ud_type,2 sort_no,合计 fiscal_date,DAT…

输入java -version 命令行没反应的简单解决办法【亲测有效】

💧 记录一下今天遇到的 b u g \color{#FF1493}{记录一下今天遇到的bug} 记录一下今天遇到的bug💧 🌷 仰望天空,妳我亦是行人.✨ 🦄 个人主页——微风撞见云的博客🎐 🐳 数据结构与算法…

qemu+buildroot+linux arm64操作系统虚拟化-宿主系统wsl2

文章目录 1.qemu2.buildroot配置编译 3.linux kernel下载交叉编译工具链 linux kernel 5.16配置内核config_kernel.shbuild_kernel.sh 4.启动虚拟机start_qemu.sh参数解释运行 环境: wls2、qemu8.2、buildroot、linuxkernel 1.qemu https://buildroot.org/download…

Python知识点:lambda 表达式

大家好,欢迎来到 Crossin的编程教室 ! Python 是一门简洁的语言,lambda 表达式则充分体现了 Python 这一特点。 lambda 表达可以被看做是一种匿名函数。它可以让你快速定义一个极度简单的单行函数。譬如这样一个实现三个数相加的函数&#xf…

学会使用perf性能分析工具(含移植到开发板)

文章目录 一、在ubuntu中使用apt包下载Perf二、使用源码安装Perf,并移植到arm-linux环境下三、使用perf四、Perf的功能介绍 系统:Ubuntu18.04系统 内核版本:5.4.0-150-generic(通过uname -r查看) 一、在ubuntu中使用ap…

Linux驱动系列-PWM驱动

转自:嵌入式系统研发 1.概述 本文主要讲述了Linux的PWM驱动框架、实现方法、驱动添加方法和调试方法。 示例Linux内核版本:6.2.8。 2.原理 PWM是Pulse-Width Modulation的简称,中文译作脉冲宽度调制。作为一种调制技术,PWM的…

SpringBoot实现异步调用的几种方式

一、使用 CompletableFuture 实现异步任务 CompletableFuture 是 Java 8 新增的一个异步编程工具,它可以方便地实现异步任务。使用 CompletableFuture 需要满足以下条件: 异步任务的返回值类型必须是 CompletableFuture 类型; 在异步任务中…

基于vasp计算材料红外与Raman光谱信息

使用方法一:获取材料raman活性信息 代码链接:VASP/Sibulk-VASP at master raman-sc/VASP GitHub 前置计算材料的振动频率和介电常数等,参考INCAR如下: SYSTEM Si_bulk ISTART 0 # From-scratch; job : 0-new 1-cont 2-same…

4-2 贪心算法的基本要素

博主简介:一个爱打游戏的计算机专业学生博主主页: 夏驰和徐策所属专栏:算法设计与分析 1.什么是贪心选择性质 贪心选择性质是一种在算法设计中经常使用的策略。它基于这样的思想:在每一步选择中,都选择当前看起来最优…

多篇论文入选ICASSP 2023,火山语音有效解决多类实践问题

近日由IEEE主办、被誉为世界范围内最大规模、也是最全面的信号处理及其应用方面的顶级学术会议ICASSP2023于希腊召开,该会议具有权威、广泛的学界以及工业界影响力,备受AI领域多方关注。会上火山语音多篇论文被接收并发表,内容涵盖众多前沿领…

superset db upgrade报错记录

superset db upgrade报错记录 报错1报错2报错3报错4报错5报错6成功了 报错1 (superset) [hyjhadoop102 ~]$ superset db upgradefrom markupsafe import soft_unicode ImportError: cannot import name soft_unicode from markupsafe (/opt/module/miniconda3/envs/superset/l…

git基本操作(笔记)

安装 查看是否安装成功 git --version配置用户名和邮箱 参数global表示全局配置,对所有仓库生效,system表示系统配置,对所有用户生效,省略是(local)表示本地配置,只对本地仓库有效。 git config…