设计模式之命令模式

命令模式

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

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

命令模式角色
  • 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)
相关推荐
jiayi2 小时前
从 0 到 1 带你打造一个工业级 TypeScript 状态机
前端·设计模式·状态机
yw00yw2 小时前
常见的设计模式
开发语言·javascript·设计模式
我们从未走散2 小时前
设计模式学习笔记-----抽象责任链模式
java·笔记·学习·设计模式·责任链模式
别再问我单例了5 小时前
01-设计模式系列之---七大原则助你高效开发(完整版)
设计模式
快乐的划水a6 小时前
中介者模式及优化
c++·设计模式·中介者模式
pengzhuofan7 小时前
Java设计模式-代理模式
java·设计模式·代理模式
郝学胜-神的一滴18 小时前
C++ Core Guidelines 核心理念
开发语言·c++·设计模式·代码规范
西红柿维生素20 小时前
设计模式之责任链模式
设计模式·责任链模式
再学一点就睡1 天前
手撕前端常用 7 种设计模式:从原理到实战,附完整代码案例
前端·设计模式