【Python笔记-设计模式】命令模式

一、说明

命令模式是一种行为设计模式,旨在对命令的封装,根据不同的请求将方法参数化、延迟请求执行或将其放入队列中,且能实现可撤销操作。

(一) 解决问题

  • 将请求发送者和接受者解耦,请求发送者只需知道如何发送请求,而无需知道请求是如何被处理、谁来处理请求。
  • 支持请求的排队、记录请求日志、撤销操作等功能。

(二) 使用场景

  • 需要将操作参数化,以便在不同的时刻执行、排队或记录请求。
  • 需要支持命令的撤销(Undo)操作。
  • 需要支持命令的排队执行。

二、结构

  1. 发送者(Sender)负责对请求进行初始化,其中必须包含一个成员变量来存储对于命令对象的引用。发送者触发命令,而不向接收者直接发送请求。注意,发送者并不负责创建命令对象:它通常会通过构造函数从客户端处获得预先生成的命令。
  2. 命令(Command)接口通常仅声明一个执行命令的方法。
  3. 具体命令(ConcreteCommands)会实现各种类型的请求。具体命令自身并不完成工作,而是会将调用委派给一个业务逻辑对象。但为了简化代码,这些类可以进行合并。接收对象执行方法所需的参数可以声明为具体命令的成员变量。你可以将命令对象设为不可变,仅允许通过构造函数对这些成员变量进行初始化。
  4. 接收者(Receiver)类包含部分业务逻辑。几乎任何对象都可以作为接收者。绝大部分命令只处理如何将请求传递到接收者的细节,接收者自己会完成实际的工作。
  5. 客户端(Client)会创建并配置具体命令对象。客户端必须将包括接收者实体在内的所有请求参数传递给命令的构造函数。此后,生成的命令就可以与一个或多个发送者相关联了。

三、伪代码

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__doc__ = """
命令模式例:模拟灯光控制场景,使用命令模式实现打开、关闭、撤销操作
"""from abc import ABC, abstractmethod
from collections import dequeclass Command(ABC):"""抽象命令基类"""@abstractmethoddef execute(self):pass@abstractmethoddef undo(self):passclass LightOnCommand(Command):"""具体命令类(开灯)"""def __init__(self, light):self.light = lightdef execute(self):self.light.turn_on()def undo(self):self.light.turn_off()class LightOffCommand(Command):"""具体命令类(关灯)"""def __init__(self, light):self.light = lightdef execute(self):self.light.turn_off()def undo(self):self.light.turn_on()class Light:"""接收者类"""def turn_on(self):print(" - 灯光打开")def turn_off(self):print(" - 灯光关闭")class RemoteControl:"""调用者类"""def __init__(self):self.commands = {}self.command_queue = deque()self.undo_command = Nonedef set_command(self, slot, command):self.commands[slot] = commanddef press_button(self, slot):if slot in self.commands:self.commands[slot].execute()self.undo_command = self.commands[slot]def undo_last_command(self):if self.undo_command:self.undo_command.undo()def run_commands(self):while self.command_queue:command = self.command_queue.popleft()command.execute()def add_to_queue(self, slot):if slot in self.commands:self.command_queue.append(self.commands[slot])if __name__ == "__main__":"""执行命令- 灯光打开- 灯光关闭撤销命令- 灯光打开排队执行命令- 灯光关闭- 灯光打开"""light = Light()remote_control = RemoteControl()remote_control.set_command(0, LightOnCommand(light))remote_control.set_command(1, LightOffCommand(light))print("执行命令")remote_control.press_button(0)remote_control.press_button(1)print("撤销命令")remote_control.undo_last_command()print("排队执行命令")remote_control.add_to_queue(1)remote_control.add_to_queue(0)remote_control.run_commands()

四、优缺点

优点

  • 降低系统耦合度: 命令模式将请求发送者和接收者解耦,发送者和接收者之间不直接交互,降低了彼此之间的依赖关系,使得系统更加灵活。
  • 容易扩展: 新的命令类可以很容易地添加到系统中,而不影响其他类。
  • 支持撤销和重做: 命令模式可以将命令对象保存起来,以支持撤销和重做操作。
  • 支持命令的排队和记录: 可以将命令对象排队起来,实现对请求的延迟执行或记录日志。

缺点

  • 增加系统复杂度:每个命令都需要一个具体命令类,可能会导致类的数量增加,增加系统的复杂度。

【Python笔记】设计模式-CSDN博客

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

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

相关文章

LVGL 环境搭建-基于WSL

背景说明 小白刚开始接触LVGL,前些日子狠心花198元入手了一块堪称LVGL 入门利器~HMI-Board 开发板,虽然有RT-Thread 集成好的LVGL 环境,只需要几个步骤就能成功把lvgl 的示例运行起来,对于爱折腾的我来说,过于简单也并…

Sora专辑|AI视频制作新时代的曙光:OpenAI Sora 模型启示录

本文深入剖析 OpenAI 最新发布的人工智能视频生成模型 Sora 的工作原理,并探讨它对电影制作行业的深远影响。Sora 利用海量数据和强大的计算能力,学习视频的"语法规则"即物理定律,从而生成逼真的视频画面。Sora 将从根本上改变电影制作的方式,降低制作成本、赋能…

融合快慢路径:SlowFast Networks引领视频行为识别新纪元

SlowFast Networks for Video Recognition 的技术原理 随着深度学习和计算机视觉技术的快速发展,视频行为识别成为了一个备受关注的研究领域。SlowFast Networks,由Facebook AI研究院(FAIR)提出的一个通用行为识别框架&#xff0…

OWASP发布AI大模型应用网络安全治理检查清单

文章目录 前言一、部署大模型之前的准备LLM部署策略的选择方案AI大模型的常见部署类型二、大模型应用时的安全检查清单1、对抗性风险2、威胁建模3、AI资产盘点4、AI安全和隐私培训5、建立并参考商业案例6、公司治理7、法律合规8、实现大模型解决方案9、测试、评估、验证和确认(…

vue2、vue3各自的响应式原理

查看本专栏目录 关于作者 还是大剑师兰特:曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;CSDN知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas&#x…

小龙虾优化算法COA求解不闭合MD-MTSP,可以修改旅行商个数及起点(提供MATLAB代码)

一、小龙虾优化算法COA 小龙虾优化算法(Crayfsh optimization algorithm,COA)由Jia Heming 等人于2023年提出,该算法模拟小龙虾的避暑、竞争和觅食行为,具有搜索速度快,搜索能力强,能够有效平衡全局搜索和局部搜索的能力。 参考文献: [1] Jia, H., Rao, H., Wen, C.…

助力智能化农田作物除草,基于DETR(DEtection TRansformer)模型开发构建农田作物场景下玉米苗、杂草检测识别分析系统

在我们前面的系列博文中,关于田间作物场景下的作物、杂草检测已经有过相关的开发实践了,结合智能化的设备可以实现只能除草等操作,玉米作物场景下的杂草检测我们则少有涉及,这里本文的主要目的就是想要基于DETR模型来开发构建玉米…

【春运抢票攻略浅析】

参考 最全12306放票规则,抢票策略,候补作用2023年12306抢票攻略(纯技巧) 研究放票规则,候补的时候车次进行一下挑选,能够买长乘短的尽量买长,不要候补一些区间票吧,这是一开始放票…

LeetCode刷题---确认率

解题思路: 将Signups和Confirmations进行左连接,连接的条件为Signups.user_idConfirmations.user_id 根据题中要求进行查询,这里使用AVG聚合函数来求解确认率 AVG(c.action‘confirmed’)表示对action列进行求平均,如果action‘confirmed’&a…

【题解】—— LeetCode一周小结8

【题解】—— 每日一道题目栏 上接:【题解】—— LeetCode一周小结7 19.N 叉树的后序遍历 题目链接:590. N 叉树的后序遍历 给定一个 n 叉树的根节点 root ,返回 其节点值的 后序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示&#x…

深度学习目标检测】二十、基于深度学习的雾天行人车辆检测系统-含数据集、GUI和源码(python,yolov8)

雾天车辆行人检测在多种场景中扮演着至关重要的角色。以下是其作用的几个主要方面: 安全性提升:雾天能见度低,视线受阻,这使得驾驶者和行人在道路上的感知能力大大降低。通过车辆行人检测技术,可以在雾天条件下及时发现…

【Linux】head命令使用

head命令 head是一个在 Unix 和 Unix-like 操作系统中常用的命令行工具,用于输出文件的前 n 行。默认为 10,即显示 10 行的内容。 语法 head [options] [file(s)] head命令 -Linux手册页 选项及作用 执行令 : head --help 执行命令结果…

k8s二进制部署的搭建

1.1 常见k8s安装部署方式 ●Minikube Minikube是一个工具,可以在本地快速运行一个单节点微型K8S,仅用于学习、预览K8S的一些特性使用。 部署地址:Install Tools | Kubernetes ●Kubeadm Kubeadm也是一个工具,提供kubeadm init…

文心一言 VS 讯飞星火 VS chatgpt (203)-- 算法导论15.3 2题

二、对一个16个元素的数组,画出2.3.1节中MERGE-SORT过程运行的递归调用树。解释备忘技术为什么对MERGE-SORT这种分治算法无效。需要写代码的时候,请用go语言。 文心一言,代码不完整: 首先,让我们明确2.3.1节中的MERG…

docker创建mongodb数据库容器

介绍 本文将通过docker创建一个mongodb数据库容器 1. 拉取mongo镜像 docker pull mongo:3.63.6版本是一个稳定的版本,可以选择安装此版本。 2. 创建并启动主数据库 容器数据卷配置 /docker/mongodb/master/data # 数据库数据目录(宿主机&am…

算法刷题day18

目录 引言一、最长上升子序列II二、最短编辑距离三、编辑距离 引言 本章内容实际上是对线性DP的一个扩展内容,线性DP主要是DP的一个分类,就是它的状态转移方程是线性的,就是一维一维的,其实我也没理解,人家就是这样说…

c语言之二维数组定义与初始化

二维数组可以理解和一个表格类似的东西,只不过没有行名称和列名称 二维数组的表达方式是 类型说明符 数组名[常量表达式] [常量表达式] 比如 int a [3] [4]{{1,2,3,4},{5,6,7,8},{9,10,11,12}} a [3] [4] 是一个二维数组表达式,a是数组名,…

数据结构之:堆

堆(Heap)是计算机科学中的一种特别的完全二叉树结构,它满足某种特定顺序,用于实现优先队列等数据结构。堆主要有两种类型:最大堆(Max Heap)和最小堆(Min Heap)。 定义 …

云原生周刊:Docker 推出 Docker Build Cloud

开源项目推荐 Kube-Vip Kube-Vip 旨在为 Kubernetes 集群提供高可用性和负载均衡功能。它提供了一个可插拔的 VIP(虚拟 IP)管理器,可以为集群中的服务分配一个虚拟 IP 地址,并自动将流量路由到正确的节点。该项目提供了多种配置…