23中设计模式之一— — — —命令模式的详细介绍

news2024/11/22 23:03:41

命令模式 Command Pattern讲解

  • 概念
  • 描述
    • 模式结构
      • 主要角色
      • 模式的UIM类图
      • 模式优点
      • 模式缺点
      • 应用场景
      • 实例演示
        • 类图
        • 代码演示
        • 运行结果

概念

命令模式(别名:动作,事务)
命令模式是一种行为设计模式,将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。

描述

命令模式的本质封装请求
在命令模式中,我们通常会定义一个抽象的Command接口,其中声明了一个execute()方法。具体的命令类(ConcreteCommand)将实现这个execute()方法,将一个发送者(Invoker)的请求转换为一个或多个接收者(Receiver)的操作。发送者并不知道接收者的具体实现,它只需要触发命令对象的execute()方法即可

模式结构

主要角色

1、命令接口(Command Interface):定义了一个统一的执行操作的接口,通常包含一个execute()方法。
2、具体命令(Concrete Command):实现了命令接口,负责具体的业务逻辑处理。它通常会持有对接收者(Receiver)的引用。
3、接收者(Receiver):真正知道如何执行命令的实体。任何类都可能成为一个接收者。
4、调用者/请求者(Invoker/Client):负责调用命令对象的execute()方法,它并不关心命令是如何被执行的,也不知道具体的接收者是谁。

模式的UIM类图

在这里插入图片描述

模式优点

1、在命令模式中,请求者(Invoker)不直接与接收者(Receiver)交互,即请求者(Invoker)不包含接收者(Receiver)的引用,因此彻底消除了彼此之间的耦合。
2、命令模式满足“开-闭原则”。如果增加新的具体命令和该命令的接受者,不必修改调用者的代码,调用者就可以使用新的命令对象;反之,如果增加新的调用者,不必修改现有的具体命令和接受者,新增加的调用者就可以使用已有的具体命令。
3、由于请求者的请求被封装到了具体命令中,那么就可以将具体命令保存到持久化的媒介中,在需要的时候,重新执行这个具体命令。因此,使用命令模式可以记录日志。
4、使用命令模式可以对请求者的“请求”进行排队。每个请求都各自对应一个具体命令,因此可以按一定顺序执行这些具体命令。

模式缺点

  • 类数量增加:引入了大量的命令类,可能会导致类的数量急剧增加,增加了系统的复杂度。
  • 设计复杂度:在包含大量命令和复杂撤销操作的系统中,设计和管理命令模式可能会比较复杂。

应用场景

  • UI事件处理:在图形界面系统中,用户的各种操作(如点击按钮)可以被封装为命令对象,然后由控制器统一处理。
  • 日志与事务:通过命令模式记录用户的操作日志,便于后续审计或回滚事务。
  • 宏命令:将多个命令组合成一个宏命令,实现批量操作。
  • 支持撤销/重做功能:命令模式天然适合于实现软件中的撤销和重做功能。

实例演示

题目:模拟带控制开关的小电器。该电器上有四个开关,两个一组,其中一组负责打开、关闭小电器上的照明灯,另一组负责打开、关闭小电器上的摄像头

类图

在这里插入图片描述

代码演示
package task2;

public interface Command {
	public void execute();
	

}

package task2;

public class Light {
	public void on() {
		System.out.println("灯找了");
	}

	public void off() {
		System.out.println("灯灭了");

	}

}

package task2;

public class OnLightCommand implements Command {
	public Light light;

	public OnLightCommand(Light light) {
		// TODO Auto-generated constructor stub
		this.light=light;
	}

	public void execute() {
		light.on();
	}

}

package task2;

public class OffLightCommand implements Command {
	public Light light;

	public OffLightCommand(Light light) {
		// TODO Auto-generated constructor stub
		this.light=light;
	}

	public void execute() {
		light.off();

	}

}

package task2;

public class Camera {
	public void on(){
		System.out.println("摄像头开了");
		
	}
	public void off(){
		System.out.println("摄像头灭了");
	}

}

package task2;

public class OnCameraCommand implements Command {
	public Camera camera;
	public OnCameraCommand(Camera camera){
		this.camera=camera;
	}
	public void execute() {
		camera.on();

	}

}

package task2;

public class OffCameraCommand implements Command {
	public Camera camera;
	public OffCameraCommand(Camera camera){
		this.camera=camera;
	}
	public void execute(){
		camera.off();
		
	}

}

package task2;

public class Invoker {
	public Command command;

	public void setCommand(Command command) {
		this.command = command;
	}

	public void executeCommand(Command command) {
		command.execute();

	}

}

测试类

package task2;

public class Test {
	public static void main(String[] args) {
		Light light = new Light();
		Command command1 = new OnLightCommand(light);
		Command command2 = new OffLightCommand(light);
		Invoker invoker = new Invoker();
		invoker.setCommand(command1);
		invoker.executeCommand(command1);
		invoker.setCommand(command2);
		invoker.executeCommand(command2);
		Camera camera = new Camera();
		Command command3 = new OnCameraCommand(camera);
		Command command4 = new OffCameraCommand(camera);
		invoker.setCommand(command3);
		invoker.executeCommand(command3);
		invoker.setCommand(command4);
		invoker.executeCommand(command4);

	}

}

在这个例子中,Command 是一个接口,定义了 execute 方法。OnLightCommand OffLightCommand OnCameraCommand OffCameraCommand 是 Command 接口的具体实现.Invoker 是请求者,它持有一个 Command 对象,并提供了获取命令并执行命令。

运行结果

在这里插入图片描述
博主用心写,读者点关注;互动传真情,知识不迷路

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

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

相关文章

内网-2(代理)

一、代理概述 1、代理服务器(proxy server):代理网络用户去取得网络信息,介于浏览器与web服务器之间的一条服务器。 注:为了方便,以下用B来代表浏览器的主机,S来代表服务器的主机。 2、正向代理和反向代理 正向代…

shell(一)

shell 既是脚本语言又是应用程序 查看自己linux系统的默认解析:echo $SHELL 创建第一个shell 文件 touch 01.sh编辑 vi 01.sh01.sh 文件内容 #!/bin/bash echo felicia保存 按Esc 然后输入:wq 定义以开头:#!/bin/bash #!用来声明脚本由什么shell解释…

如何在路由器上安装代理服务:详细教程

如何在路由器上安装代理服务:详细教程 步骤一:通过漏洞进入路由器系统开启Telnet服务使用Telnet登录路由器系统查看系统信息和CPU信息步骤二:交叉编译MIPS程序 Go对MIPS的支持 安装TFTP Server使用BusyBox tftp传输文件在路由器系统中下载编译…

Linux.小技巧快捷键

1. ctrl c 强制停止 终止某些程序的运行 也可以取消某行命令 2. ctrl d 退出或登出 进入python环境中,使用ctrl d 退出 3.history 查看历史使用了哪些命令 4. ! 历史最近使用的命令的开头 5.使用ctrl r 搜索历史使用的命令 按下 ctrl r 会进入 reverse -…

GIS赋能低空经济:开辟天空新蓝海

在21世纪的科技浪潮中,低空经济作为新兴业态正悄然崛起,成为继陆地、海洋之后的又一战略要地。本文旨在探讨GIS如何赋能低空经济,推动无人机应用、空中交通管理、低空物流、城市空域规划等领域的发展,开启天空经济的新纪元。 GIS…

Xmind Pro 2024 专业版激活码(附下载链接)

说到思维导图,就不能不提 Xmind。这是一款优秀的思维导图工具,拥有着丰富的导图模板,漂亮的界面和配色,以及各种各样的创意工具。 新架构速度更快 采用全新 Snowdancer 引擎,一种堪称「黑科技」的先进图形渲染技术。…

CrawlSpace爬虫部署框架介绍

CrawlSpace爬虫部署框架介绍 全新的爬虫部署框架,为了适应工作的爬虫部署的使用,需要自己开发一个在线编写爬虫及部署爬虫的框架,框架采用的是Django2.2bootstap依赖scrapyd开发的全新通用爬虫在线编辑部署及scrapy项目的部署框架。项目实现的…

VCRUNTIME140_1.dll是什么?VCRUNTIME140_1.dll缺失的7个不同解决方法详解

vcruntime140_1.dll是Microsoft Visual C 2015运行时库的一部分,它为使用Visual C 2015编译的应用程序提供了必要的运行时支持。该文件包含多个关键的运行时组件,包括标准模板库(STL)、C异常处理、内存管理等。 功能: vcruntime140_1.dll确保应用程序能…

在人工智能背景下,程序员要有什么职业素养,怎么改进

文章目录 1. 持续学习和适应能力原因改善方法 2. 跨学科知识原因改善方法 3. 高效的计算资源利用原因改善方法 4. 模型解释性和可控性原因改善方法 5. 数据隐私和安全意识原因改善方法 在AI大模型的背景下,程序员要有什么职业素养,怎么改进,才…

电流继电器JL-31 柜内固定安装 约瑟JOSEF

JL系列电流继电器型号: 电流继电器JL-31 电流继电器JL-31C/1 电流继电器JL-31A 电流继电器JL-31/B 电流继电器JL-32BP 电流继电器JL-22 电流继电器JL-21 电流继电器JL-21B 电流继电器JL-23 电流继电器JL-11 电流继电器JL-11/2G 电流继电器JL-11C 电流继电器J…

5.23.3 乳腺癌成像中的深度学习:十年的进展和未来方向

乳腺影像学在早期诊断和干预以改善乳腺癌患者的预后方面发挥着重要作用。在过去的十年中,深度学习在乳腺癌成像分析方面取得了显着进展,在解释乳腺成像模式的丰富信息和复杂背景方面具有巨大前景。 基于深度学习的乳腺癌成像研究涵盖了对乳房X光检查、超声、磁共振成像和数字…

无人机推流/RTMP视频推拉流EasyDSS无法卸载软件是什么原因?

视频推拉流/直播点播EasyDSS平台支持音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务,在应用场景中可实现视频直播、点播、转码、管理、录像、检索、时移回看等。此外,平台还支持用户自行上传视频文件,也可将上传的点播…

记Codes开源免费研发项目管理平台——流程驱动缺陷管理的创新实现

继上一回合日报与工时融合集中式填报的创新实现后,本篇我们来讲一讲流程驱动缺陷管理的创新实现。 肯定会有人说,不就缺陷管理嘛!几个状态完事,爱咋整就咋整,没必要搞流程化,搞流程就是把简单事情复杂化。 …

ViewModel原理分析

认识 ViewModel ViewModel 是一种用来存储和管理UI相关数据的类。 ViewModel 的作用可以从两个方面去理解: UI界面控制器:在最初的MVC模式中,由于 Activity / Fragment 承担的职责过重,因此在后续的 MVP、MVVM 模式中&#xff…

iOS 通过PacketLogger 抓包蓝牙数据包

当使用iOS平台调试蓝牙外设时,需要抓取蓝牙数据包,那么如何获取iOS端设备与蓝牙设备之间通信的蓝牙数据包呢? 一、资料准备 1、苹果手机 2、Xcode开发工具 3、Apple开发者账户 二、环境搭建 2.1、手机环境搭建 手机浏览器访问地址&…

nginx: [error] invalid PID number ““ in “/run/nginx.pid“

两种问题,我自己碰到的情况 ./nginx -s reload执行命令后报错 nginx: [error] invalid PID number ““ in “/run/nginx.pid“ 第一种情况,pid被注释了 /usr/local/nginx/conf/nginx.conf #user nobody; worker_processes 1;// 可能是这里被注释了…

吴恩达2022机器学习专项课程C2W2:2.23 选修_反向传播算法的工作原理(什么是导数图计算大型神经网络)

目录 引言一.导数的计算1.epsilon与导数的关系2.其它导数符号形式3.导数小结 二.小型神经网络的计算图1.什么是计算图(前向传播过程)2.反向传播计算过程3.验证反向传播的计算结果4.为什么用反向传播计算导数? 三.扩大神经网络的计算图1.计算反…

精准导航:用A*算法优化栅格地图的路径规划【附Matlab代码】

目录 1.算法原理2.代码讲解3.结果展示4.代码获取 1.算法原理 A* 算法是一种基于传统图搜索的智能启发式算法,它具有稳定性高、节点搜索效率高等优点。主要原理为:以起点作为初始节点,搜索初始节点旁 8 个邻域,并通过启发函数评估…

Kubernetes 二进制安装

目录 一、环境介绍 1.1、本节实验环境 1.2、实验拓扑 1.3、实验要求 1.4、实现思路 二、系统环境准备 2.1、主机配置 2.2、安装 Docker 2.3、设置防火墙 2.4、禁用 SELinux 三、生成通信加密证书 3.1、生成 CA 证书 3.2、生成 server 证书 3.3、生成 …

最大的游戏交流社区Steam服务器意外宕机 玩家服务受影响

易采游戏网6月3日消息:众多Steam游戏玩家报告称,他们无法访问Steam平台上的个人资料、好友列表和社区市场等服务。同时,社区的讨论功能也无法正常使用。经过第三方网站SteamDB的确认,,这一现象是由于Steam社区服务器突…