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

Python设计模式详解之14 —— 命令模式

命令模式 (Command Pattern) 是一种行为型设计模式,它将请求封装为对象,从而使您可以用不同的请求、队列或日志来参数化其他对象。命令模式还支持撤销操作。

在 Python 中,命令模式通常用来解耦命令的发送者(调用者)和接收者(执行者),使得命令的调用者不需要知道命令是如何执行的。


结构

  1. 命令接口 (Command): 定义执行操作的接口。
  2. 具体命令 (ConcreteCommand): 实现命令接口,定义执行者的操作。
  3. 接收者 (Receiver): 执行具体命令逻辑的对象。
  4. 调用者 (Invoker): 请求命令执行的对象。
  5. 客户端 (Client): 创建具体命令对象并配置调用者。

Python 实现

from abc import ABC, abstractmethod

# Command 接口
class Command(ABC):
    @abstractmethod
    def execute(self):
        pass

    @abstractmethod
    def undo(self):
        pass

# Receiver
class Light:
    def turn_on(self):
        print("The light is ON")

    def turn_off(self):
        print("The light is OFF")

# ConcreteCommand
class LightOnCommand(Command):
    def __init__(self, light: Light):
        self.light = light

    def execute(self):
        self.light.turn_on()

    def undo(self):
        self.light.turn_off()

class LightOffCommand(Command):
    def __init__(self, light: Light):
        self.light = light

    def execute(self):
        self.light.turn_off()

    def undo(self):
        self.light.turn_on()

# Invoker
class RemoteControl:
    def __init__(self):
        self.command = None

    def set_command(self, command: Command):
        self.command = command

    def press_button(self):
        if self.command:
            self.command.execute()

    def press_undo(self):
        if self.command:
            self.command.undo()

# Client
if __name__ == "__main__":
    # 创建接收者
    light = Light()

    # 创建具体命令
    light_on = LightOnCommand(light)
    light_off = LightOffCommand(light)

    # 创建调用者
    remote = RemoteControl()

    # 打开灯
    remote.set_command(light_on)
    remote.press_button()
    remote.press_undo()

    print()

    # 关闭灯
    remote.set_command(light_off)
    remote.press_button()
    remote.press_undo()

输出结果

The light is ON
The light is OFF

The light is OFF
The light is ON

模式要点

  1. 解耦: 调用者和接收者被解耦,调用者不需要知道具体的接收者和执行逻辑。
  2. 扩展性: 可以轻松添加新命令,而不修改调用者或接收者的代码。
  3. 历史记录: 可以将命令存储起来用于日志记录或撤销功能。

优点

  • 更好地支持开闭原则(OCP)。
  • 提供了对命令的撤销和重做功能的支持。
  • 命令可以被记录、序列化,支持延迟执行。

缺点

  • 增加了类的数量(每个命令对应一个类)。
  • 对于简单的操作,可能显得过于复杂。

适用场景

  1. 需要将一组操作封装成对象。
  2. 希望记录操作历史、支持撤销和重做功能。
  3. 需要参数化某些行为或操作。

通过命令模式,可以更灵活地管理行为的调用和执行!


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

相关文章:

  • 对于公平与效率的关系问题,材料中有两种不同倾向性的观点,请对这两种观点分别加以概述并谈谈你的看法。字数不超过500字。
  • XG(S)-PON原理
  • Pytorch微调深度学习模型
  • sklearn中常用数据集简介
  • 计算机网络八股整理(一)
  • android-studio-4.2下载 、启动
  • 【41-50期】Java核心面试问题深度解析:从数据库优化到并发场景解决方案
  • 新版国标GB28181设备端EasyGBD支持GB28181-2016GB28181-2022支持ARM IPC以及Android安卓移动设备
  • 【Python爬虫五十个小案例】爬取猫眼电影Top100
  • 医疗数据质量安全,数据安全解决方案,医院关心的数据安全问题,信息安全方案(Word原件)
  • 深度学习入门- 梯度(Gradient)(三)
  • RabbitMQ 安装延迟队列插件 rabbitmq_delayed_message_exchange
  • 华为Mate 70系列发布,揭示AI+消费电子产业化新阶段
  • scrapy框架学习
  • laravel中队列使用
  • 基于FPGA的信号DM编解码实现,包含testbench和matlab对比仿真
  • linux运行vue编译后的项目
  • ensp静态路由实验
  • CTF-RE 从0到N:c语言是如何利用逻辑运算符拆分变量和合并的
  • LeetCode数组题
  • C# Http Post 长连接和短连接请求
  • 【jvm】对象的内存布局
  • 【软件入门】Git快速入门
  • 《黑神话:悟空》游戏辅助修改器工具下载指南与操作方法详解
  • 4.6 JMeter HTTP信息头管理器
  • git(Linux)