行为模式2.命令模式------灯的开关
行为型模式
- 模板方法模式(Template Method Pattern)
- 命令模式(Command Pattern)
- 迭代器模式(Iterator Pattern)
- 观察者模式(Observer Pattern)
- 中介者模式(Mediator Pattern)
- 备忘录模式(Memento Pattern)
- 解释器模式(Interpreter Pattern)
- 状态模式(State Pattern)
- 策略模式(Strategy Pattern)
- 职责链模式(Chain of Responsibility Pattern)
- 访问者模式(Visitor Pattern)
命令模式(Command Pattern) 是一种行为型设计模式,它将一个请求封装为一个对象,从而使你可以用不同的请求、队列或日志来参数化其他对象。命令模式让你能够将请求发送者与请求接收者解耦,发送者只关心发送命令,而不需要知道如何处理它们。命令模式非常适合用于需要将多个操作组合成一个单一操作、撤销操作等场景。
主要角色
- Command(命令接口):声明了执行操作的接口。
- ConcreteCommand(具体命令):实现了命令接口,并定义了与接收者的绑定关系。具体命令对象将请求传递给接收者。
- Receiver(接收者):知道如何实施与请求相关的操作。具体的操作由接收者完成。
- Invoker(调用者):负责调用命令对象执行请求。
- Client(客户端):创建命令对象并设置其接收者。
- Invoker(调用者):请求命令的执行。
+-----------+ +-------------------+ +------------+
| Client |------->| Invoker |------->| Command |
+-----------+ +-------------------+ +------------+
| |
v v
+-------------+ +-------------------+
| Receiver | | ConcreteCommand |
+-------------+ +-------------------+
工作原理
- 命令:创建一个命令对象,将请求转发到接收者对象。
- 调用者:调用命令对象的
execute()方法来触发命令的执行。 - 接收者:接收请求并执行相关操作。
命令模式的优点
- 解耦请求者与执行者:发送请求的对象(调用者)不需要知道请求是如何被执行的,只需要知道如何调用命令接口。
- 灵活性高:可以将多个请求组合成一个命令,命令也可以进行撤销、重做等操作。
- 扩展性好:增加新命令时,只需要扩展新的命令类,无需修改现有的代码,符合开闭原则。
Java 示例代码
假设我们有一个遥控器(Invoker),可以控制开关家里的灯(Receiver),而每个按钮的动作就是一个命令(Command)。
// Command接口:所有具体命令的共同接口
public interface Command {void execute();void undo();
}// Receiver:接收命令并执行相关操作
public class Light {public void turnOn() {System.out.println("Light is ON");}public void turnOff() {System.out.println("Light is OFF");}
}// ConcreteCommand:开灯命令
public class LightOnCommand implements Command {private Light light; // 接收者public LightOnCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.turnOn(); // 执行接收者的动作}@Overridepublic void undo() {light.turnOff(); // 撤销操作}
}// ConcreteCommand:关灯命令
public class LightOffCommand implements Command {private Light light;public LightOffCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.turnOff(); // 执行接收者的动作}@Overridepublic void undo() {light.turnOn(); // 撤销操作}
}// Invoker:遥控器,调用命令
public class RemoteControl {private Command command;// 设置命令public void setCommand(Command command) {this.command = command;}// 执行命令public void pressButton() {command.execute();}// 撤销命令public void pressUndo() {command.undo();}
}public class CommandPatternDemo {public static void main(String[] args) {// 创建接收者Light light = new Light();// 创建具体命令Command lightOn = new LightOnCommand(light);Command lightOff = new LightOffCommand(light);// 创建遥控器(调用者)RemoteControl remote = new RemoteControl();// 使用遥控器控制开关灯remote.setCommand(lightOn);remote.pressButton(); // 输出:Light is ONremote.setCommand(lightOff);remote.pressButton(); // 输出:Light is OFF// 撤销操作remote.pressUndo(); // 输出:Light is ON}
}
相关文章:
行为模式2.命令模式------灯的开关
行为型模式 模板方法模式(Template Method Pattern)命令模式(Command Pattern)迭代器模式(Iterator Pattern)观察者模式(Observer Pattern)中介者模式(Mediator Pattern…...
Kerberos用户认证-数据安全-简单了解-230403
hadoop安全模式官方文档:https://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/SecureMode.html kerberos是什么 kerberos是计算机网络认证协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证。 概念&#…...
【Multisim用74ls92和90做六十进制】2022-6-12
缘由Multisim如何用74ls92和90做六十进制-其他-CSDN问答 74LS92、74LS90参考...
滴滴工作流引擎Turbo与logicFlow研究
目录 logicFlow turbo 工作流引擎很多,也都提供了前端UI库,但是太过于冗杂了,元数据表都几十个,logincFlow和Turbo的组合提供了轻量化方式,turbo后端代码只有5个元数据表,logicFlow也提供了bpm的相关扩展功能,但缺点是turbo社区不活跃,logicFlow个人认为跟echarts这种…...
AE Pinnacle 10x6 kW DeviceNet MDXL User r Manual
AE Pinnacle 10x6 kW DeviceNet MDXL User r Manual...
Flutter Android修改应用名称、应用图片、应用启动画面
修改应用名称 打开Android Studio,打开对应项目的android文件。 选择app下面的manifests->AndroidManifest.xml文件,将android:label"bluetoothdemo2"中的bluetoothdemo2改成自己想要的名称。重新启动或者重新打包,应用的名称…...
Nginx rewrite 执行顺序(草稿,下次继续编辑)
个人结论: 1.server层ngx_http_rewrite_module模块相关指令按照配置顺序依次执行; 2.server层执行完break指令后,该层级所有跟ngx_http_rewrite_module模块相关的指令都不再被执行,但是不影响其他模块(例如:https://zhuanlan.zhihu.com/p/357…...
01.03周五F34-Day44打卡
文章目录 1. 这家医院的大夫和护士对病人都很耐心。2. 她正跟一位戴金边眼镜的男士说话。3. 那个人是个圆脸。4. 那个就是传说中的鬼屋。5. 他是个很好共事的人。6. 我需要一杯提神的咖啡。7. 把那个卷尺递给我一下。 ( “卷尺” 很复杂吗?)8. 他收到了她将乘飞机来的消息。9.…...
数字货币支付系统开发搭建:构建未来的区块链支付生态
随着数字货币的迅猛发展,越来越多的企业和机构开始关注如何搭建一个高效、安全、可扩展的数字货币支付系统。区块链技术因其去中心化、安全性高、透明性强等优势,已成为开发数字货币支付系统的首选技术。本文将深入探讨数字货币支付系统的开发和搭建过程…...
NLP CH3复习
CH3 3.1 几种损失函数 3.2 激活函数性质 3.3 哪几种激活函数会发生梯度消失 3.4 为什么会梯度消失 3.5 如何解决梯度消失和过拟合 3.6 梯度下降的区别 3.6.1 梯度下降(GD) 全批量:在每次迭代中使用全部数据来计算损失函数的梯度。计算成本…...
BurpSuite2024.11
新增功能 2024 年 11 月 25 日,版本 24.11 此版本引入了站点地图过滤器 Bambdas、匹配和替换 Bambdas、用于 API 扫描的动态身份验证令牌,以及用于入侵者攻击的增强负载管理。我们还进行了多项用户体验改进、性能改进和一些错误修复。 使用 Bambdas 过…...
亚信安全2025年第1期《勒索家族和勒索事件监控报告》
本周态势快速感知 本周全球共监测到勒索事件51起,本周勒索事件数量降至近一年来最低,需注意防范。从整体上看Ransomhub依旧是影响最严重的勒索家族;本周Acrusmedia和Safepay也是两个活动频繁的恶意家族,需要注意防范。本周&#…...
【工具进阶】使用 Nmap 进行有效的服务和漏洞扫描
在渗透测试中,Nmap 是一款功能强大的经典工具。其应用场景广泛,包括主机发现、端口扫描、服务检测等。然而,要充分发挥 Nmap 的潜力,需要遵循科学的流程和规范。本文将为您详细介绍如何使用 Nmap 进行高效的渗透测试,同…...
【工具推荐】XSS 扫描器-XSStrike
介绍 XSStrike 是一个跨站点脚本检测套件,配备四个手写解析器、一个智能有效载荷生成器、一个强大的模糊测试引擎以及速度极快的爬虫。XSStrike 不会像其他工具一样注入有效载荷并检查其是否有效,而是使用多个解析器分析响应,然后通过与模糊…...
Spring Boot 各种事务操作实战(自动回滚、手动回滚、部分回滚)
概念 事务定义 事务,就是一组操作数据库的动作集合。事务是现代数据库理论中的核心概念之一。如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务。当所有的步骤像一个操作一样被完整地执行,我们称该事务被提交。…...
Zabbix5.0版本(监控Nginx+PHP服务状态信息)
目录 1.监控Nginx服务状态信息 (1)通过Nginx监控模块,监控Nginx的7种状态 (2)开启Nginx状态模块 (3)配置监控项 (4)创建模板 (5)用默认键值…...
C# 设计模式概况
什么是设计模式 大家熟知的GOF23种设计模式,源自《Design Patterns: Elements of Reusable Object-Oriented Software》一书,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著,四人组Gang of Four简称GOF。总结了在面向…...
Nginx 配置 SSL(HTTPS)详解
Nginx作为一款高性能的HTTP和反向代理服务器,自然支持SSL/TLS加密通信。本文将详细介绍如何在Nginx中配置SSL,实现HTTPS的访问。 随着互联网安全性的日益重要,HTTPS协议逐渐成为网站加密通信的标配。Nginx作为一款高性能的HTTP和反向代理服务…...
论文解读之Generative Dense Retrieval: Memory Can Be a Burden
本次论文解读,博主带来生成式稠密检索:记忆可能成为一种负担的论文分享 一、简介 生成式检索根据给定的查询,自回归地检索相关的文档标识符,在小规模的文档库中表现不错,通过使用模型参数记忆文档库,生成…...
RTC:实时时钟
RTC:实时时钟 1、实时时钟2、闹钟中断3、秒中断4、输出功能5、BKP的读写6、BKP的侵入事件 1、实时时钟 ①RTC.c #include "RTC.h"/*** brief:RTC初始化函数*/ RCC_PeriphCLKInitTypeDef RTCPeriphClkInit; //RTC时钟配置结构体 RTC_HandleT…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
uni-app学习笔记三十五--扩展组件的安装和使用
由于内置组件不能满足日常开发需要,uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件,需要安装才能使用。 一、安装扩展插件 安装方法: 1.访问uniapp官方文档组件部分:组件使用的入门教程 | uni-app官网 点击左侧…...
医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor
1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...
验证redis数据结构
一、功能验证 1.验证redis的数据结构(如字符串、列表、哈希、集合、有序集合等)是否按照预期工作。 2、常见的数据结构验证方法: ①字符串(string) 测试基本操作 set、get、incr、decr 验证字符串的长度和内容是否正…...
