当前位置: 首页 > news >正文

行为型设计模式-命令(command)模式-python实现

设计模式汇总:查看

通俗示例

想象一下你正在使用遥控器控制家里的智能家居设备,比如空调、灯光和电视。你不需要知道空调如何冷却、灯光如何点亮或者电视如何切换频道,你只需要按下一个按钮,遥控器就会发送一个命令给相应的设备,设备接收到命令后就会执行相应的操作。这里的遥控器就是一个命令模式的例子,它将请求的发送者和接收者解耦。

通俗解释

命令模式是一种行为型设计模式,它将请求封装为一个对象,从而允许用户使用不同的请求、队列或日志请求,并支持可撤销的操作。命令模式的主要目的是将发出请求的对象和执行请求的对象解耦,使得请求的发送者不需要知道接收者的具体实现细节。

命令模式的组成包括:

  • 命令(Command)接口:定义执行操作的接口。
  • 具体命令(Concrete Command)类:实现命令接口,并持有接收者的实例。具体命令类在实现命令接口的方法时,会调用接收者相应的操作。
  • 接收者(Receiver)类:负责执行与请求相关的操作。
  • 请求者(Invoker)类:负责调用命令对象执行请求。
  • 客户端(Client)类:创建具体命令对象,并且设置其接收者。

命令模式的优点

  • 解耦性强:请求的发送者和接收者之间无需相互了解,只通过命令对象进行交互。
  • 易于扩展:可以很容易地添加新的命令类。
  • 可组合命令:可以将多个命令组合成一个宏命令。
  • 支持撤销操作:命令可以被存储、操作可以被撤销或重做。

Python代码示例

以下是一个命令模式的简单实现:

# 接收者类
class Receiver:def action(self, message):print(f"Receiver action: {message}")# 命令接口
class Command:def execute(self):pass# 具体命令类
class ConcreteCommand(Command):def __init__(self, receiver):self._receiver = receiverdef execute(self):self._receiver.action("Command executed!")# 请求者类
class Invoker:def __init__(self):self._command = Nonedef set_command(self, command):self._command = commanddef execute_command(self):if self._command:self._command.execute()# 客户端代码
if __name__ == "__main__":# 创建接收者、命令对象和请求者receiver = Receiver()command = ConcreteCommand(receiver)invoker = Invoker()# 设置请求者的命令对象invoker.set_command(command)# 执行请求invoker.execute_command()

在这个例子中,Receiver是接收者,负责执行相关的操作。Command是一个命令接口,ConcreteCommand是实现了命令接口的具体命令类,持有接收者的实例,并在执行时调用接收者的操作。Invoker是请求者,它接收命令对象,并在某个时间点调用命令对象的execute方法来发出请求。

总结

命令模式通过将请求封装成对象,实现了请求的发送者和接收者之间的解耦,提高了软件系统的灵活性。它适用于需要对操作进行记录、请求排队、撤销/重做操作等场景。在图形用户界面(GUI)工具栏和菜单、数据库事务操作等领域,命令模式是非常常见的设计模式。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • knime用三种方法提取列中需要的数据实战
  • ffmpeg音视频开发从入门到精通——ffmpeg下载编译与安装
  • php、Java、python房屋租赁系统 在线租房系统 房源出租平台(源码、调试、LW、开题、PPT)
  • 纵向合并单元格——table
  • Python爬虫入门篇!
  • 【QNX+Android虚拟化方案】101 - Android GVM 虚拟网络 Virt-Net 配置
  • YOLOv9模型训练或测试过程中,无法打印模型的GFLOPs
  • shell脚本编程(数组)
  • 智能家居系统(基于STM32F103C8T6标准库+FreeRTOS+Qt串口开发实现)
  • 【系统架构设计师-2010年】综合知识-答案及详解
  • Java 7.3 - 分布式 id
  • QT教程:start()和startTimer()的区别
  • 第五章 Pytorch完成线性回归
  • 小白入门LLM大模型最牛X教程------上交《动手学大模型应用开发》!
  • 语音测试(一)ffmpeg视频转音频
  • 0x05 Python数据分析,Anaconda八斩刀
  • Babel配置的不完全指南
  • co.js - 让异步代码同步化
  • ES6语法详解(一)
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • Joomla 2.x, 3.x useful code cheatsheet
  • JS题目及答案整理
  • k8s如何管理Pod
  • leetcode-27. Remove Element
  • Node项目之评分系统(二)- 数据库设计
  • orm2 中文文档 3.1 模型属性
  • python学习笔记-类对象的信息
  • Spring Cloud中负载均衡器概览
  • Theano - 导数
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • Xmanager 远程桌面 CentOS 7
  • 阿里研究院入选中国企业智库系统影响力榜
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 多线程 start 和 run 方法到底有什么区别?
  • 前嗅ForeSpider中数据浏览界面介绍
  • 浅谈Golang中select的用法
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 再谈express与koa的对比
  • 阿里云服务器购买完整流程
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #APPINVENTOR学习记录
  • (160)时序收敛--->(10)时序收敛十
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (bean配置类的注解开发)学习Spring的第十三天
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (笔试题)合法字符串
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (四)c52学习之旅-流水LED灯
  • (一)Linux+Windows下安装ffmpeg
  • (游戏设计草稿) 《外卖员模拟器》 (3D 科幻 角色扮演 开放世界 AI VR)