设计模式之命令模式

命令模式

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

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

命令模式角色
  • 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)
相关推荐
幂简集成explinks6 小时前
e签宝签署API更新实战:新增 signType 与 FDA 合规参数配置
后端·设计模式·开源
大飞pkz10 小时前
【设计模式】C#反射实现抽象工厂模式
设计模式·c#·抽象工厂模式·c#反射·c#反射实现抽象工厂模式
努力也学不会java10 小时前
【设计模式】抽象工厂模式
java·设计模式·oracle·抽象工厂模式
青草地溪水旁11 小时前
设计模式(C++)详解—抽象工厂模式 (Abstract Factory)(2)
c++·设计模式·抽象工厂模式
青草地溪水旁11 小时前
设计模式(C++)详解—抽象工厂模式 (Abstract Factory)(1)
c++·设计模式·抽象工厂模式
Magnetic_h20 小时前
【iOS】设计模式复习
笔记·学习·ios·设计模式·objective-c·cocoa
A阳俊yi21 小时前
设计模式——结构型模式
设计模式
酷飞飞1 天前
Qt Designer与事件处理
开发语言·qt·命令模式
努力也学不会java1 天前
【设计模式】状态模式
java·设计模式·状态模式
.豆鲨包1 天前
【设计模式】单例模式
java·单例模式·设计模式