第一章 前言
第二章 观察者模式
第三章 状态模式
第四章 中介模式
第五章 装饰器模式
第六章 单例模式
第七章 克隆模式
第八章 职责链模式
第九章 代理模式
第十章 外观模式
第十一章 迭代模式
第十二章 组合模式
第十三章 构建模式
第十四章 适配模式
第十五章 策略模式
第十六章 简单工厂模式
第十七章 工厂方法模式
第十八章 抽象工厂模式
第十九章 命令模式
第二十章 备忘录模式
第二十一章 享元模式
第二十二章 访问模式
第二十三章 模板模式
第二十四章 桥接模式
第二十五章 解释器模式
第二十六章 过滤器模式
第二十七章 对象池技术
第二十八章 回调机制
第二十九章 MVC模式
附录
1. 核心思想
将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
在餐馆中点餐,我们只要发一个订单就能吃到我们想要的那种加工方式的美味佳肴,而不用知道厨师是谁,更不用关心他是怎么做的。像点餐的订单一样,发送者(客户)与接收者(厨师)没有任何依赖关系,我们只要发送订单就能完成想要完成的任务。
命令模式的最大特点是将具体的命令与对应的接收者相关联(捆绑),使得调用方不用关心具体的行动执行者及如何执行,只要发送正确的命令,就能准确无误地完成相应的任务。
2. 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 设计要点
命令模式中主要有四个角色,在设计命令模式时要找到并区分这些角色。
- 命令(Command):要完成的任务,或要执行的动作,这是命令模式的核心角色。
- 接收者(Receiver):任务的具体实施方,或行动的真实执行者。
- 调度者(Invoker):接收任务并发送命令,对接用户的需求并执行内部的命令,负责外部用户与内部命令的交互。
- 用户(Client):命令的使用者,即真正的用户。
4.2 优缺点
- 优点
- 对命令的发送者与接收者进行解耦,使得调用方不用关心具体的行动执行者及如何执行,只要发送正确的命令即可。
- 可以很方便地增加新的命令。
- 缺点
- 在一些系统中可能会有很多命令,而每一个命令都需要一个具体的类去封装,容易使命令的类急剧膨胀。
5. 应用场景
- 你希望系统发送一个命令(或信号),任务就能得到处理时。如GUI中的各种按钮的点击命令,再如自定义一套消息的响应机制。
- 需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互时。
- 需要将一系列的命令组合成一组操作时,可以使用宏命令的方式。