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

行为型设计模式-命令(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 = receiver
    
    def execute(self):
        self._receiver.action("Command executed!")

# 请求者类
class Invoker:
    def __init__(self):
        self._command = None
    
    def set_command(self, command):
        self._command = command
    
    def 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)工具栏和菜单、数据库事务操作等领域,命令模式是非常常见的设计模式。


http://www.kler.cn/a/290766.html

相关文章:

  • 跟我学c++中级篇——C++中的缓存利用
  • IntelliJ IDEA 中 Editor > General > Appearance 设置:编辑器的视觉外观和行为
  • Linux内核 -- UIO (User-space I/O) 简介与使用笔记
  • 有没有免费提取音频的软件?音频编辑软件介绍!
  • IBatis和MyBatis在细节上的不同有哪些
  • MySQL变量
  • C++判断语句(基础速通)ac-wing
  • OpenAI发布GPT-4o mini,3.5从此退出历史舞台?
  • 10.9 网络安全概述
  • watchdog: BUG: soft lockup - CPU#3 stuck for 23s! [swapper/0:1]
  • 微信小程序跳转到另一个微信小程序
  • 2025第十二届广州国际汽车零部件加工技术及汽车模具展览会
  • 替代 Django 默认 User 模型并使用 `django-mysql` 添加数据库备注20240904
  • 国内PFMEA的实施困境与价值探讨
  • 天气预报爬虫
  • kali——wpscan的使用
  • Mac工程动态库配置和加载探究
  • 【论文阅读】CiteTracker: Correlating Image and Text for Visual Tracking
  • RabbitMQ 03 在项目中的实际使用
  • Azure OpenAI Ingesion Job API returns 404 Resource not found
  • 【图论入门】图的存储
  • 【编程底层思考】什么是JVM对象内存分配的空间分配担保,咋担保的?
  • [环境配置]Pycharm手动安装汉化插件
  • Redis缓存预热方案详解:提升应用性能与用户体验
  • ActiViz实战:使用Actor2D画一个二维网格
  • Unity | 内存优化之资源冗余问题