设计模式之命令模式

命令模式

将请求和操作封装成对象,将不同请求和其接收者分开解耦来实现请求的发送、执行、撤销等操作。

换句话说就是, 命令模式把 命令内容、命令执行者、调用者或调用时间点分离,实现了请求的发送和执行之间的解耦。

命令模式角色
  • command接口类:定义执行命令的方法 execute
  • 具体命令类:实现 command接口,实现execute方法,包含一个接收者对象,执行具体的业务逻辑
  • invoker类(调用者): 负责发送命令,不关心命令如何执行,只在需要时调用具体命令类的execute方法,通过命令接口与具体命令类对象交互; 比如遥控器
  • receiver(接收者):实际执行命令,负责调用命令的执行。 比如 电视机
  • client(客户端)
命令模式优缺点

优点:

  • 解耦发送者和接收者
  • 支持日志记录和撤销操作: 命令被封装成对象、可以记录命令的历史,支持撤销和重做操作
  • 支持队列和异步执:命令可以被添加到队列中,延迟执行,或者在不同的线程中执行

缺点:

  • 增加了系统的复杂性
  • 过度使用可能导致性能问题: 命令过于细粒度,可能会增加系统的开销。
命令模式的应用场景
  • GUI用户界面,将按钮点击事件等分装成命令,传给相应的处理程序,如 pyqt信号和槽
  • 事务处理系统: 命令可以被记录下来,支持事务的回滚和重做
  • 脚本和宏: 命令可以被记录下来,形成一个脚本,供后续执行。 如使用shell脚本将多个命令封装,并提供给crontab定时任务调用; django中的 BaseCommand类。还有批处理系统将多个命令组合成宏命令批量执行。
  • 游戏开发领域: 将玩家的按键操作命令记录下来,供后续回放
python 复制代码
# 接口类
class Command:

    def execute(self):
        pass


# 具体命令类
class TvTurnOnCommand(Command):

    def __init__(self, tv):
        self.tv = tv

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


class TvTurnOffCommand(Command):

    def __init__(self, tv):
        self.tv = tv

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


# 接收者类(如电视机)
class Tv:

    def turn_on(self):
        print("打开电视")

    def turn_off(self):
        print("关闭电视")


# 调用者类(如万能遥控器)
class RemeteCtrl:

    def __init__(self):
        self.commands = []

    def _add_command(self, command):
        self.commands.append(command)

    def revoke(self):
        "返回按钮"
        self.commands.pop()
        if self.commands:
            self.commands[-1].execute()

    def press_button(self, command):
        self._add_command(command)
        self.command.execute()


# 客户端
tv = TV()  # 创维、海信、小米..等任何品牌的电视机

# 命令主体
turn_on_command = TvTurnOnCommand(tv)
turn_off_command = TvTurnOffCommand(tv)

# 遥控器发送命令,只管把命令发送出去
remote_ctrl = RemoteCtrl()
remote_ctrl.press_button(turn_on_command)
remote_ctrl.press_button(turn_off_command)
相关推荐
BD_Marathon9 小时前
设计模式——合成复用原则
设计模式·合成复用原则
书院门前细致的苹果19 小时前
设计模式大全:单例、工厂模式、策略模式、责任链模式
设计模式·责任链模式·策略模式
BD_Marathon1 天前
设计模式——依赖倒转原则
java·开发语言·设计模式
BD_Marathon1 天前
设计模式——里氏替换原则
java·设计模式·里氏替换原则
jmxwzy1 天前
设计模式总结
设计模式
无小道1 天前
QT——QFIie和QFileInfo文件类
开发语言·qt·命令模式
J_liaty2 天前
23种设计模式一代理模式
设计模式·代理模式
苏渡苇2 天前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
短剑重铸之日2 天前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
feasibility.2 天前
AI 编程助手进阶指南:从 Claude Code 到 OpenCode 的工程化经验总结
人工智能·经验分享·设计模式·自动化·agi·skills·opencode