【设计模式】命令模式
其他系列文章导航
Java基础合集
数据结构与算法合集设计模式合集
多线程合集
分布式合集
ES合集
文章目录
其他系列文章导航
文章目录
前言
一、什么是命令模式?
二、命令模式的优点和应用场景
三、命令模式的要素和实现
3.1 命令
3.2 具体命令
3.3 接受者
3.4 调用者
3.5 客户端
四、总结
前言
欢迎来到【设计模式】系列博客,今天我们将探讨其中一种重要的设计模式——命令模式。
设计模式是软件开发中解决常见问题的最佳实践,而命令模式则是其中一种非常实用的设计模式,它可以帮助我们更好地组织和管理请求或命令。
在本篇博客中,我们将详细介绍命令模式的定义、特点、使用场景以及实现方式。通过具体的案例和实践,我们将深入了解命令模式在实际项目中的应用和优势。同时,我们还将分享一些注意事项和最佳实践,以帮助您更好地理解和应用命令模式。
希望通过本篇博客的学习,您能够掌握命令模式的基本概念和用法,并在实际项目中灵活运用这一设计模式,提高软件的质量和效率。
一、什么是命令模式?
命令模式是一种行为型设计模式,核心是将每种请求或操作封装为一个独立的对象,从而可以集中管理这些请求或操作,比如将请求队列化依次执行、或者对操作进行记录和撤销。
命令模式通过将请求的发送者(客户端)和接收者(执行请求的对象)解耦,提供了更大的灵活性和可维护性。
二、命令模式的优点和应用场景
命令模式最大的优点就是解耦请求发送者和接受者,让系统更加灵活、可扩展。
由于每个操作都是一个独立的命令类,所以我们需要新增命令操作时,不需要改动现有代码。
命令模式典型的应用场景:
- 系统需要统一处理多种复杂的操作,比如操作排队、记录操作历史、撤销重做等。
- 系统需要持续增加新的命令、或者要处理复杂的组合命令(子命令),使用命令模式可以实现解耦。
三、命令模式的要素和实现
3.1 命令
相当于遥控器操作按钮的制作规范
命令是一个抽象类或接口,它定义了执行操作的方法,通常是execute
,该方法封装了具体的操作。
public interface Command {void execute();
}
3.2 具体命令
相当于遥控器的某个操作按钮
具体命令是命令接口的具体实现类,它负责将请求传递给接收者(设备)并执行具体的操作。
比如定义一个关闭设备命令:
public class TurnOffCommand implements Command {private Device device;public TurnOffCommand(Device device) {this.device = device;}public void execute() {device.turnOff();}
}
还可以定义开启设备命令:
public class TurnOnCommand implements Command {private Device device;public TurnOnCommand(Device device) {this.device = device;}public void execute() {device.turnOn();}
}
3.3 接受者
相当于被遥控的设备
接收者是最终执行命令的对象,知道如何执行具体的操作。
比如定义一个设备类:
public class Device {private String name;public Device(String name) {this.name = name;}public void turnOn() {System.out.println(name + " 设备打开");}public void turnOff() {System.out.println(name + " 设备关闭");}
}
3.4 调用者
相当于遥控器
作用是接受客户端的命令并执行。
比如定义遥控器类:
public class RemoteControl {private Command command;public void setCommand(Command command) {this.command = command;}public void pressButton() {command.execute();}
}
以上只是最基础的调用者类,还可以给遥控器类增加更多能力,比如存储历史记录、撤销重做等。
3.5 客户端
相当于使用遥控器的人
客户端的作用是创建命令对象并将其与接收者关联(绑定设备),然后将命令对象传递给调用者(按遥控器),从而触发执行。
示例客户端:
public class Client {public static void main(String[] args) {// 创建接收者对象Device tv = new Device("TV");Device stereo = new Device("Stereo");// 创建具体命令对象,可以绑定不同设备TurnOnCommand turnOn = new TurnOnCommand(tv);TurnOffCommand turnOff = new TurnOffCommand(stereo);// 创建调用者RemoteControl remote = new RemoteControl();// 执行命令remote.setCommand(turnOn);remote.pressButton();remote.setCommand(turnOff);remote.pressButton();}
}
在这个示例中,命令模式将遥控器按钮的按下操作与实际设备的开关操作解耦,从而实现了灵活的控制和可扩展性。
整个程序的 UML 类图如下:
四、总结
在软件开发中,我们经常需要处理各种请求或命令,这些请求或命令可能是来自用户、系统或其他组件。
如何有效地管理和处理这些请求或命令,对于提高软件的可维护性和可扩展性至关重要。命令模式可以帮助我们实现这一目标。
命令模式的主要思想是将请求或命令封装成一个对象,从而将发出请求的客户端与接收请求的服务端操作解耦。
这样,我们可以将请求或命令传递给服务端进行相应的处理,而不必直接依赖于服务端的具体实现。同时,通过将请求或命令封装成对象,我们可以更好地组织和管理这些请求或命令,提高代码的可读性和可维护性
相关文章:
【设计模式】命令模式
其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、什么是命令模式? 二、命令模式的优点和应用场景 三、命令模式的要素和实现 3.1 命令 3.2 具体命令 3.3 接受者 …...
Unity头发飘动效果
Unity头发飘动 介绍动作做头发飘动头发骨骼绑定模拟物理组件 UnityChan插件下载UnityChan具体用法确定人物是否绑定好骨骼节点(要做的部位比如头发等)给人物添加SpringManager骨骼管理器给骨骼节点添加SpringBone这里给每个头发骨骼都添加上SpringBone。…...
【MIKE】MIKE河网编辑器操作说明
目录 MIKE河网编辑器说明河网定义河网编辑工具栏河网文件(.nwk11)输入步骤1. 从传统的地图引入底图1.1 底图准备1.2 引入河网底图1.3 输入各河段信息2. 从ARCView .shp文件引入底图MIKE河网编辑器说明 河网编辑器主要功能有两个: ①河网的编辑和参数输人,包括数字化河网及…...
RIPV1配置实验
查看路由器路由表: 删除手工配置的静态路由项: Route1->Config->static Remove删除路由项 删除Route3的路由项,方法同上删除Route2的路由项,方法同上 完成路由器RIP配置: Route1->Config->RIP->Ne…...
快速实现农业机械设备远程监控
农业机械设备远程监控解决方案 一、项目背景 近年来,农业生产事故时有发生,农业安全问题已经成为农业生产中的关键问题,农业监控系统在农业安全生产中发挥着重要作用。农业机械设备以计划维修或定期保养为主,在日常应用的过程中因…...
解决用Fiddler抓包,网页显示你的连接不是专用/私密连接
关键:重置fiddler的证书 在Fiddler重置证书 1、Actions --> Reset All Certificates --> 弹窗一路yes 2、关掉Fiddler,重新打开 3、手机删掉证书,重新下载安装。 (如果还不行,重新试一遍,先把浏览器…...
单片机原理及应用:流水灯的点亮
流水灯是一种简单的单片机控制电路,由许多LED组成,电路工作时LED会按顺序点亮,类似于流水的效果。 下面是运行在keil上的代码,分别使用了数组,移位符和库函数来表示。 //数组法 #include <reg52.h> //头文…...
蓝桥杯宝藏排序算法(冒泡、选择、插入)
冒泡排序: def bubble_sort(li): # 函数方式for i in range(len(li)-1):exchangeFalsefor j in range(len(li)-i-1):if li[j]>li[j1]:li[j],li[j1]li[j1],li[j]exchangeTrueif not exchange:return 选择排序: 从左往右找到最小的元素,放在起始位置…...
使用@jiaminghi/data-view实现一个数据大屏
<template><div class"content bg"><!-- 全局容器 --><!-- <dv-full-screen-container> --><!-- 第二行 --><div class"module-box" style"align-items: start; margin-top: 10px"><!-- 左 -->…...
神经网络:池化层知识点
1.CNN中池化的作用 池化层的作用是对感受野内的特征进行选择,提取区域内最具代表性的特征,能够有效地减少输出特征数量,进而减少模型参数量。按操作类型通常分为最大池化(Max Pooling)、平均池化(Average Pooling)和求和池化(Sum Pooling)&a…...
微服务常见的配置中心简介
微服务架构中,常见的配置中心包括以下几种: Spring Cloud Config: Spring Cloud Config是官方推荐的配置中心解决方案,它支持将配置文件存储在Git、SVN等版本控制系统中。通过提供RESTful API,各个微服务可以远程获取和…...
银河麒麟v10 rpm安装包 安装mysql 8.35
银河麒麟v10 rpm安装包 安装mysql 8.35 1、卸载mariadb2、下载Mysql安装包3、安装Mysql 8.353.1、安装Mysql 8.353.3、安装后配置 1、卸载mariadb 由于银河麒麟v10系统默认安装了mariadb 会与Mysql相冲突,因此首先需要卸载系统自带的mariadb 查看系统上默认安装的M…...
一篇文章带你搞定CTFMice基本操作
CTF比赛是在最短时间内拿到最多的flag,mice必须要有人做,或者一支战队必须留出一块时间专门写一些mice,web,pwn最后的一两道基本都会有难度,这时候就看mice的解题速度了! 说实话,这是很大一块&…...
Spring security之授权
前言 本篇为大家带来Spring security的授权,首先要理解一些概念,有关于:权限、角色、安全上下文、访问控制表达式、方法级安全性、访问决策管理器 一.授权的基本介绍 Spring Security 中的授权分为两种类型: 基于角色的授权&…...
模式识别与机器学习(十一):Bagging
1.原理 Bagging [Breiman, 1996a] 是井行式集成学习方法最著名的代表.从名字即可看出,它直接基于自助采样法(bootstrap sampling)。给定包含m 个样本的数据集,我们先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得…...
数据压缩(哈夫曼编码)
【问题描述】在数据压缩问题中,需要将数据文件转换成由二进制字符0、1组成的二进制串,称之为编码,已知待压缩的数据中包含若干字母(A-Z),为获得更好的空间效率,请设计有效的用于数据压缩的二进制…...
移动安全APP--Frida+模拟器,模拟器+burp联动
最近测APP被通报了,问题点测得比较深,涉及到frida和burp抓包,一般在公司可能会有网络的限制,手机没办法抓包,我就直接在模拟器上试了,就在这记录一下安装过程。 目录 一、Frida安装 二、burp与逍遥模拟器…...
MATLAB遗传算法工具箱的三种使用方法
MATLAB中有三种调用遗传算法的方式: 一、遗传算法的开源文件 下载“gatbx”压缩包文件,解压后,里面有多个.m文件,可以看到这些文件的编辑日期都是1998年,很古老了。 这些文件包含了遗传算法的基础操作,包含…...
复习linux——时间同步服务
加密和安全当前都离不开时间的同步,否则各种网络服务可能不能正常运行 时间错误可能导致证书应用出错 时间同步服务 多主机协作工作时,各个主机的时间同步很重要,时间不一致会造成很多重要应用故障,利用NTP协议使网络中的各个计算机时间达到…...
如何在Linux设置JumpServer实现无公网ip远程访问管理界面
文章目录 前言1. 安装Jump server2. 本地访问jump server3. 安装 cpolar内网穿透软件4. 配置Jump server公网访问地址5. 公网远程访问Jump server6. 固定Jump server公网地址 前言 JumpServer 是广受欢迎的开源堡垒机,是符合 4A 规范的专业运维安全审计系统。JumpS…...
【Git】在 IDEA 中合并多个 commit 为一个
文章目录 1 未提交到远程分支1.1 需求说明1.2 reset 操作1.3 再次 push 2 已经提交到远程分支2.1 需求说明2.2 rebase 操作2.3 强制 push 分两种情况: 一种是本地提交还没推到远程,这种好处理另一种是已经提交到远程分支,这个略麻烦 1 未提…...
性能实战(一) --- clock_gettime造成系统整体cpu过高定位过程
问题背景 有一台linux服务器测试环境cpu经常到达80%,造成系统卡顿,部分功能不可用. 分析步骤 1.使用perf制作cpu火焰图 通过制作cpu火焰图,发现很多进程都存在大量的clock_gettime系统调用. 2. 使用bcc工具funclatency`进一步查看clock_gettime的调用次数 # /usr/share/bc…...
Ai 会替代人类工作吗?
目录 一、分析 二、一些案例 三、总结 一、分析 人工智能(AI)的发展和应用正在改变我们的生活和工作方式。在某些领域,AI已经显示出了强大的能力和潜力,可以比人类更快、更准确地完成任务。然而,是否会完全取代人类…...
神经网络:深度学习基础
1.反向传播算法(BP)的概念及简单推导 反向传播(Backpropagation,BP)算法是一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见算法。BP算法对网络中所有权重计算…...
如何在Windows上搭建WebDAV服务并通过内网穿透实现公网访问
文章目录 前言1. 安装IIS必要WebDav组件2. 客户端测试3. 使用cpolar内网穿透,将WebDav服务暴露在公网3.1 安装cpolar内网穿透3.2 配置WebDav公网访问地址 4. 映射本地盘符访问 前言 在Windows上如何搭建WebDav,并且结合cpolar的内网穿透工具实现在公网访…...
【Transformer框架代码实现】
Transformer Transformer框架注意力机制框架导入必要的库Input Embedding / Out EmbeddingPositional EmbeddingTransformer EmbeddingScaleDotProductAttention(self-attention)MultiHeadAttention 多头注意力机制EncoderLayer 编码层Encoder多层编码块/前馈网络层…...
Apache ShenYu 网关JWT认证绕过漏洞 CVE-2021-37580
Apache ShenYu 网关JWT认证绕过漏洞 CVE-2021-37580 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建漏洞利用 修复建议总结 Apache ShenYu 网关JWT认证绕过漏洞 CVE-2021-37580 已亲自复现) 漏洞名称 漏洞描述 Apache ShenYu是一个异步的,高性能的&#x…...
锐捷配置重发布RIP进OSPF中
一、实验拓扑 二、实验目的 使用两种动态路由协议,并使两种协议间的路由可以传递 三、实验配置 第一步:配置全网基本IP R1 Ruijie>enable Ruijie#configure terminal Ruijie(config)#interface gigabitEthernet 0/0 Ruijie(config-if-GigabitEthe…...
Android R修改wifi热点默认为隐藏热点以及禁止自动关闭热点
前言 Android R系统中WLAN 热点设置里面默认是没有wifi热点的隐藏设置选项的,如果默认wifi热点为隐藏热点可以修改代码实现。另外wifi热点设置选项里面有个自动关闭热点,这个选项默认是打开的,有些机器里面配置wifi热点后默认是需要关闭掉的,以免自动关闭后要手动打开。 …...
智能优化算法应用:基于人工大猩猩部队算法3D无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于人工大猩猩部队算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于人工大猩猩部队算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工大猩猩部队算法4.实验参…...
微信公众平台开发代理/seo实战
集合(set)类型也是用来保存多个的字符串元素,但和列表类型不一样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过索引下标获取元素。集合user:1:follow包含着"it"、"music"、"his"、"sports"四个元素。Redis除…...
160 作者 网站建设 amp/个人接app推广单去哪里接
while 1:try:lst1 = list(map(int, input().split()))[1:]lst2 = list(<...
深圳网站建设网络推广/市场营销分析案例
神经网络漫谈(一):科普篇 发表时间: 2023年1月6日创作地点:湖北省武汉市作者:ixy_com&[Bill Kromydas]封面图片来源:Towards Data Science 1、背景 基本概念:神经网络,也称为人工神经网络 (ANN) 或…...
wordpress revolution slider/汕头seo管理
link: http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid25575&page1&extra 使用ArcGIS Engine 开发自定义GIS应用:第一部分:使用ArcGIS Engine 发布自定义GIS应用软件-全面了解ArcGIS Engine的产品。第二部分:ArcEngine9.2的新特…...
网站管理助手 phpmyadmin/网络广告营销方案策划内容
目录 第1章 概览 第2章 存储集群架构 2.1 存储池 2.2 身份认证 2.3 PG(s) 2.4 CRUSH 2.5 I/O操作 2.5.1 副本I/O 2.5.2 纠删码I/O 2.6 自管理的内部操作 2.6.1 心跳 2.6.2 同步 2.6.3 数据再平衡与恢复 2.6.4 校验(或擦除) 2.7 高可用 2.7.1 数据副本 2.7.2 Mon集群 2.7.…...
wordpress邮箱解析/公司网站seo外包
1 <?php 2 $result sendHB(100, 10); 3 var_export($result); 4 echo array_sum($result); 5 6 /** 7 * 拼手气红包实现 8 * 生成num个随机数,每个随机数占随机数总和的比例*money_total的值即为每个红包的钱额 9 * 考虑到精度问题,最后重…...