【软考】设计模式之命令模式

目录

          • 1. 说明
          • 2. 应用场景
          • 3. 结构图
          • 4. 构成
          • 5. 优缺点
            • 5.1 优点
            • 5.2 缺点
          • 6. 适用性
          • 7.java示例

1. 说明
  • 1.命令模式(Command Pattern)是一种数据驱动的设计模式。
  • 2.属于行为型模式。
  • 3.请求以命令的形式被封装在对象中,并传递给调用对象。
  • 4.调用对象寻找可以处理该命令的合适对象,并将该命令传递给相应的对象,由该对象执行命令。
  • 5.将请求(行为)封装为对象,从而使你可以用不同的请求对客户进行参数化
  • 6.对请求排队或记录请求日志,以及支持可撤销的操作。
  • 7.这种模式允许将请求的发送者与请求的执行者解耦,使得请求发送者无需关心请求如何被执行,而只需关注请求本身。
2. 应用场景
  • 1.当系统的某项操作具备命令语义,且命令实现不稳定(经常变化)时,可以通过命令模式解耦请求与实现。
  • 2.当请求调用者需要与请求接收者解耦时,命令模式可以使调用者和接收者不直接交互
  • 3.当系统需要随机请求命令或经常增加、删除命令时,命令模式可以方便地实现这些功能。
3. 结构图

在这里插入图片描述

4. 构成
  • 1.Command(命令):定义了执行操作的接口,通常包含一个execute方法,用于调用具体的操作。声明执行操作的接口。
  • 2.Invoker(调用者):请求的调用者,内部持有具体请求的引用。要求该命令执行这个请求。
  • 3.ConcreteCommand(具体命令):封装的请求对象,内部持有Receiver对象。将一个接收者对象绑定于一个动作;调用接收者相应的操作,以实现Execute。
  • 4.Receiver(接收者):请求接收者,根据请求对象的指挥进行不同的反应。知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接收者。
  • 5.Client(客户端):创建一个具体命令对象并设定它的接收者。
5. 优缺点
5.1 优点
  • 1.增加与删除命令不会影响其他类,满足“开闭原则”。
  • 2.可以实现宏命令,即组合多个命令作为一个单独命令来执行。
  • 3.方便实现撤销(Undo)和重做(Redo)操作。
  • 4.可以在现有命令的基础上,增加额外功能,比如日志记录。
5.2 缺点
  • 1.可能导致系统有过多的具体命令类:在命令模式中,每一个请求或操作都被封装成一个具体的命令类。因此,如果系统中有大量的请求或操作,那么就需要设计大量的县体命令类,这可能导致系统的复杂性增加并可能使维护和理解变得困难。
  • 2.可能增加系统的理解难度:由于命令模式涉及到命令的发送者、接收者以及具体的命令类等多个角色,对于初学者或者不熟悉该模式的人来说,可能会觉得理解起来有些困难。
  • 3.可能引发性能问题:在命令模式中,每个命令对象都需要被创建和存储,这可能会消耗一定的系统资源。如果系统中存在大量的命令对象,那么可能会引发性能问题,尤其是在内存使用和处理速度方面。
6. 适用性
  • 1.抽象出待执行的动作以参数化某对象。Command模式是过程语言中的回调(Callback)机制的一个面向对象的替代品。
  • 2.在不同的时刻指定、排列和执行请求。一个Command对象可以有一个与初始请求无关的生存期。如果一个请求的接收者可用一种与地址空间无关的方式表达,那么就可以将负责该请求的命令对象传递给另一个不同的进程并在那儿实现该请求。
  • 3.支持取消操作。Command的Execute操作可在实施操作前将状态存储起来,在取消操作时这个状态用来消除该操作的影响。Command接口必须添加一个Unexecute操作,该操作取消上一次Execute调用的效果。执行的命令被存储在一个历史列表中。可通过向后和向前遍历这一列表并分别调用Unexecute和Execute来实现重数不限的“取消”和“重做”。
  • 4.支持修改日志。这样当系统崩溃时,这些修改可以被重做一遍。在Command 接口中添加装载操作和存储操作,可以用来保持变动的一个一致的修改日志。从崩溃中恢复的过程包括从磁盘中重新读入记录下来的命令并用 Execute 操作重新执行它们。
  • 5.用构建在原语操作上的高层操作构造一个系统。这样一种结构在支持事务(Transaction)的信息系统中很常见。Command 模式提供了对事务进行建模的方法。Commmand 有一个公共接口,使得可以用同一种方式调用所有的事务,同时使用该模式也易于添加新事务以扩展系统。
7.java示例
  • 1.灯类
package com.learning.command.light;public class Light {public void on() {  System.out.println("开灯");}  public void off() {  System.out.println("关灯");}  
}
  • 2.命令接口
package com.learning.command.light;/*** 命令接口*/
public interface Command {void execute();
}
  • 2.关灯实现接口
package com.learning.command.light;public class LightOffCommand implements Command {private Light light;  public LightOffCommand(Light light) {  this.light = light;  }  @Override  public void execute() {  light.off();  }  
}
  • 3.开灯实现接口
package com.learning.command.light;public class LightOnCommand implements Command {private Light light;public LightOnCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.on();}
}
  • 4.调用者
package com.learning.command.light;public class Invoker {private Command command;public void setCommand(Command command) {  this.command = command;  }  public void executeCommand() {  command.execute();  }  
}
  • 5.客户端
package com.learning.command.light;public class Client {public static void main(String[] args) {  Light light = new Light();  Invoker invoker = new Invoker();  // 创建打开灯的命令,并设置给InvokerCommand lightOnCommand = new LightOnCommand(light);  invoker.setCommand(lightOnCommand);invoker.executeCommand();// 创建关闭灯的命令,并设置给InvokerCommand lightOffCommand = new LightOffCommand(light);  invoker.setCommand(lightOffCommand);  invoker.executeCommand();}  
}
  • 4.执行结果示例
    在这里插入图片描述
  • 5.存储命令一起执行
package com.learning.command.light;import java.util.List;public class Invoker2 {private List<Command> commandList;public void addCommand(Command command) {this.commandList.add(command);}  public void executeCommand() {for (Command command : commandList) {command.execute();}}
}
package com.learning.command.light;public class Client2 {public static void main(String[] args) {  Light light = new Light();  Invoker2 invoker2 = new Invoker2();// 创建打开灯的命令,并设置给InvokerCommand lightOnCommand = new LightOnCommand(light);  invoker2.addCommand(lightOnCommand);// 创建关闭灯的命令,并设置给InvokerCommand lightOffCommand = new LightOffCommand(light);  invoker2.addCommand(lightOffCommand);invoker2.executeCommand();}  
}

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

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

相关文章

面试经典150题——买卖股票的最佳时机

面试经典150题 day7 题目来源我的题解方法一 暴力 &#xff08;超时&#xff09;方法二 动态规划方法三 动态规划 空间优化方法四 一次遍历 题目来源 力扣每日一题&#xff1b;题序&#xff1a;121 我的题解 方法一 暴力 &#xff08;超时&#xff09; 求每一对&#xff08;…

Kalman滤波器的原理与实现

Kalman滤波器是一种用于估计系统状态的算法,其可以通过融合系统的动态模型和传感器测量值来提高状态估计的精度。其原理基于线性系统理论和最优估计准则,主要用于处理具有高斯噪声的线性系统。 以下是Kalman滤波器的基本原理和实现步骤: 系统动态模型:首先需要建立系统的动…

十八章 hive基础

1&#xff09; 表的分区 大数据开发数据量较大&#xff0c;在进行数据查询计算时&#xff0c;需要对数据进行拆分&#xff0c;提升查询速度。 1-1 单个分区 单个分区时创建单个目录 1-2 多个分区 多个分区可以将数据拆分多个目录储存 注意点&#xff1a; 1 分组字段不能…

Win10 启动时数字键盘不亮怎么办?

首先&#xff0c;按住winr 运行 windows 运行框&#xff0c;输入regedit 打开注册表编辑器 1.查找current_user选项下的Control Panel 中的keyboard 点击八initialkeyboard 值设置成2&#xff0c;如图所示即可。2.选择hkey_user 中的。default 下的control Panel 选项下的keyb…

mysql断电后无法启动

1、配置/etc/my.cnf innodb_force_recovery6(这个值越小越安全,最开始建议设置为1&#xff0c;如果也无法启动再改为2&#xff0c;以此内推)1 (SRV_FORCE_IGNORE_CORRUPT)&#xff1a;即使服务器检测到损坏的页仍让它运行。试图使SELECT* FROM tbl_name跳过损坏的索引记录和页…

JavaScript事件循环

JavaScript是单线程&#xff0c;&#xff08;通常用来操作DOM&#xff0c;如果改为多线程&#xff0c;一个线程进行了1删除&#xff0c;另一个添加了DOM&#xff0c;那么浏览器该怎么处理&#xff09; 在JavaScript中&#xff0c;所有任务都可分为 同步任务&#xff1a;立即执…

美易官方:道指六连阴!美国股债双杀背后

美国股市和债市近期遭遇了罕见的双重打击&#xff0c;道指连续六个交易日下跌&#xff0c;引发市场广泛关注。这一现象背后&#xff0c;是否又上演了某一“魔咒”&#xff1f;本文将从多个角度对此进行深入分析。 道指罕见创下六连阴、标普500指数迎来硅谷银行危机以来最大两日…

工作中用Redis最多的10种场景

作者&#xff1a;苏三说技术 链接&#xff1a;https://juejin.cn/post/7325132133168971813 前言 Redis是一种非常优秀的基于KV的键值对缓存数据库&#xff0c;有非常不错的性能和稳定性&#xff0c;无论是在工作中&#xff0c;还是在面试中&#xff0c;都经常会出现。因此&am…

村庄规划中基础地理数据的获取、处理与应用

文章目录 一、三调数据1. 地类图斑2. 村级调查区二、调查数据1. 宅基地确权数据2. 公益林数据三、公开数据1. 卫星影像2. 数字高程模型3. 国家地理信息服务平台4. 其他数据一、三调数据 三调数据,是对现状土地利用情况的全面调查。成果数据以数据库的形式存储、组织与管理。具…

UC网盘、迅雷网盘拉新如何做?热门拉新项目盘点

迅雷网盘拉新项目&#xff1a; ​关键词链接 双重拉新模式&#xff1a;可以通过链接、关键词两种方式进行推广&#xff0c;匹配不同拉新场景。 网盘功能齐全&#xff1a;作为老牌网盘产品&#xff0c;功能强大&#xff0c;使用体验好&#xff0c;支持不同格式文件。 不限推广…

【七 (2)FineBI FCP模拟试卷-平台新增用户留存分析】

目录 文章导航一、字段解释1、用户平台登录信息表格2、用户平台激活信息表格 二、需求三、操作步骤1、建立用户平台登录信息表格和用户平台激活信息表格的关联关系2、将用户平台激活信息表格的激活日期添加到用户平台登录信息表格3、新增公式列&#xff0c;计算激活时间和登录时…

OpenHarmony轻量系统开发【5】驱动之GPIO点灯

5.1点灯例程源码 先看最简单得LED灯闪烁操作 源码结构如下&#xff1a; 第一个BUILD.gn文件内容&#xff1a; static_library("led_demo") {sources ["led_demo.c"]include_dirs ["//utils/native/lite/include","//kernel/liteos_m/c…

工业物联网让“制造”变成“智造”!——青创智通

工业物联网解决方案-工业IOT-青创智通 随着科技的不断进步和工业的持续发展&#xff0c;物联网&#xff08;IoT&#xff09;技术的出现为制造业带来了前所未有的变革。工业物联网&#xff08;IIoT&#xff09;作为物联网技术在工业领域的应用&#xff0c;正在逐渐改变传统的制…

@Transactional使用中的三类坑

我们知道事务有声明式事务和编程式事务两种&#xff0c;编程式事务代码侵入较高&#xff0c;声明式事务侵入较低&#xff0c;在项目中常有使用&#xff0c;然而&#xff0c;不正确的使用声明式事务&#xff0c;可能让代码未能按照我们的预期执行。 一、事务可能没有生效 Tran…

概念:Android 虚拟机

Android中的Dalvik虚拟机&#xff08;DVM&#xff09;和Android运行时&#xff08;ART&#xff09;都是运行在内存中的。它们是Android操作系统的一部分&#xff0c;为Android应用提供了一个管理执行代码的环境。具体来说&#xff1a; Dalvik虚拟机 (DVM)&#xff1a;Dalvik是…

2024-4.python4基本数据类型

基本数据类型 引言 提问 前面我们说过&#xff0c;计算机的本质作用就是用来存储和运算二进制的数据。但是在实际应用中&#xff0c;我们看到计算机存储或者运算的数据并非只有二进制的数据&#xff0c;例如使用Excel可以对一些数值数据、文本数据或者图像数据进行不同形式的处…

从iPhone恢复已删除照片的最佳软件

本文分享了从iPhone恢复已删除照片的最佳软件。如果您正在寻找如何从iPhone恢复已删除的照片&#xff0c;请查看这篇文章。 为什么您需要软件从iPhone恢复已删除的照片&#xff1f; 没有什么比丢失iPhone上的重要数据更痛苦的了&#xff0c;尤其是一些具有珍贵回忆的照片。有时…

从零开始学习深度强化学习及其在自动驾驶下的实战项目

深度强化学习及其在自动驾驶下的实战项目 本课程是为了帮助大家快速入门强化学习和学会应用深度强化学习进行算法的开发。 鉴于网上有许多开源的强化学习理论基础的视频&#xff0c;而且许多项目都是基于gym游戏进行开发的简单项目&#xff0c;并未涉及使用前沿的carla环境等自…

公司文件加密软件有监视功能吗?

公司文件加密软件不仅提供了强大的文件加密能力&#xff0c;还具备了监视功能&#xff0c;确保文件在使用过程中的安全性。华企盾DSC数据防泄密系统中的监控功能体现在以下几个方面&#xff1a; 加密文件操作日志&#xff1a;记录所有加密文件的申请、审批、扫描加解密、自动备…

Jvm垃圾回收器cms和g1区别

Jvm垃圾回收器cms和g1区别 G1垃圾回收器&#xff08;Garbage First&#xff09;和CMS &#xff08;Concurrent Mark-Sweep&#xff09;垃圾回收器是Java虚拟机&#xff08;JVM&#xff09;&#xff09;中的两种不同的垃圾回收策略&#xff0c;它们各有优缺点。以下是两者的比较…