设计模式--第十九章 命令模式

第一章 前言
第二章 观察者模式
第三章 状态模式
第四章 中介模式
第五章 装饰器模式
第六章 单例模式
第七章 克隆模式
第八章 职责链模式
第九章 代理模式
第十章 外观模式
第十一章 迭代模式
第十二章 组合模式
第十三章 构建模式
第十四章 适配模式
第十五章 策略模式
第十六章 简单工厂模式
第十七章 工厂方法模式
第十八章 抽象工厂模式
第十九章 命令模式
第二十章 备忘录模式
第二十一章 享元模式
第二十二章 访问模式
第二十三章 模板模式
第二十四章 桥接模式
第二十五章 解释器模式
第二十六章 过滤器模式
第二十七章 对象池技术
第二十八章 回调机制
第二十九章 MVC模式
附录



1. 核心思想

将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。

在餐馆中点餐,我们只要发一个订单就能吃到我们想要的那种加工方式的美味佳肴,而不用知道厨师是谁,更不用关心他是怎么做的。像点餐的订单一样,发送者(客户)与接收者(厨师)没有任何依赖关系,我们只要发送订单就能完成想要完成的任务。

命令模式的最大特点是将具体的命令与对应的接收者相关联(捆绑),使得调用方不用关心具体的行动执行者及如何执行,只要发送正确的命令,就能准确无误地完成相应的任务。

2. UML类图

命令模式UML类图

3. 框架代码

from abc import ABC,abstractmethod
import sys

class Receiver:
    def action(self):
        print(f"{self.__class__.__name__}/{sys._getframe().f_code.co_name} is running...")

class Command(ABC):
    def __init__(self, receiver:Receiver) -> None:
         self._receiver = receiver

    @abstractmethod
    def execute(self):
        pass

class CommandImpl(Command):
    def execute(self):
        self._receiver.action()

class Invoker:
    def __init__(self) -> None:
        self._command = None
    def setCommand(self, command:Command):
        self._command = command
    def action(self):
        if self._command is not None:
            self._command.execute()

if __name__ == "__main__":
    receiver = Receiver()
    command = CommandImpl(receiver)
    invoker = Invoker()

    invoker.setCommand(command)
    invoker.action()

4. 模型说明

4.1 设计要点

命令模式中主要有四个角色,在设计命令模式时要找到并区分这些角色。

  1. 命令(Command):要完成的任务,或要执行的动作,这是命令模式的核心角色。
  2. 接收者(Receiver):任务的具体实施方,或行动的真实执行者。
  3. 调度者(Invoker):接收任务并发送命令,对接用户的需求并执行内部的命令,负责外部用户与内部命令的交互。
  4. 用户(Client):命令的使用者,即真正的用户。

4.2 优缺点

  1. 优点
    • 对命令的发送者与接收者进行解耦,使得调用方不用关心具体的行动执行者及如何执行,只要发送正确的命令即可。
    • 可以很方便地增加新的命令。
  2. 缺点
    • 在一些系统中可能会有很多命令,而每一个命令都需要一个具体的类去封装,容易使命令的类急剧膨胀。

5. 应用场景

  1. 你希望系统发送一个命令(或信号),任务就能得到处理时。如GUI中的各种按钮的点击命令,再如自定义一套消息的响应机制。
  2. 需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互时。
  3. 需要将一系列的命令组合成一组操作时,可以使用宏命令的方式。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值