设计模式之命令模式

命令模式

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

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

命令模式角色
  • 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)
相关推荐
触底反弹15 分钟前
🤯 面试被问 AI Workflow 和 Agent 有啥区别?3 张图 + 2 段代码讲清楚!
人工智能·设计模式·面试
杨充21 小时前
10.可测试性实战设计
设计模式·开源·代码规范
杨充21 小时前
9.重构十二式的实战
设计模式·开源·代码规范
杨充21 小时前
6.设计原则的全景图
设计模式·开源·全栈
杨充21 小时前
2.面向对象的特性
设计模式
杨充21 小时前
7.SOLID原则案例汇
设计模式·开源·全栈
杨充21 小时前
8.反模式与坏味道
设计模式·开源·代码规范
杨充21 小时前
3.接口vs抽象类比较
设计模式
咖啡八杯1 天前
文法、BNF与AST
java·设计模式·解释器模式·ast·文法