设计模式之命令模式

命令模式

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

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

命令模式角色
  • 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)
相关推荐
AI人工智能+电脑小能手11 小时前
大白话说Java设计模式-08-建造者模式(业务实战篇)
java·设计模式·建造者模式·架构设计·对象构建
AustinXu14 小时前
从 Claude Code 到 Claude Tag,Harness Engineering 走到了组织这一层
设计模式·团队管理
剧中有戏14 小时前
单例模式从入门到精通:一个数据库连接池的完整剖析
设计模式
胡萝卜术14 小时前
编译期与运行期的双重防线:从 TypeScript 类型之争到 LLM 输出的自动化择优
前端·设计模式·面试
货拉拉技术14 小时前
重塑 Agent 度量衡:基于 LLM-as-a-Judge 的离线评估体系与实践
算法·设计模式
KhalilRuan15 小时前
设计模式小记
设计模式
卡牌RWA研究院15 小时前
Relique:一张精品卡牌如何从收藏品变成可交易的链上资产?
设计模式·金融·区块链·创业创新
剧中有戏1 天前
抽象工厂模式从入门到精通:一个多云存储案例的完整剖析(修订版)
设计模式
MC皮蛋侠客2 天前
Redis 系列(八):缓存设计模式与一致性——从 Cache Aside 到防雪崩
redis·缓存·设计模式
莫得感情 o2 天前
设计模式 18 · 状态模式
设计模式·状态模式