← 返回 Day 40 正文

Day 40 · 图解

行为型模式关系图

三种行为型模式的关系

graph TB subgraph "行为型设计模式" Observer["观察者模式<br/>一对多通知"] Strategy["策略模式<br/>算法可替换"] Command["命令模式<br/>请求封装为对象"] end subgraph "核心机制" PubSub["发布-订阅"] Delegation["组合委托"] Encapsulation["封装请求"] end subgraph "典型应用" EventDriven["事件驱动系统"] Configurable["可配置算法"] UndoRedo["撤销/重做"] TaskQueue["任务队列"] PluginSys["插件系统"] MacroCmd["宏命令"] end Observer --> PubSub Strategy --> Delegation Command --> Encapsulation PubSub --> EventDriven PubSub --> PluginSys Delegation --> Configurable Delegation --> PluginSys Encapsulation --> UndoRedo Encapsulation --> TaskQueue Encapsulation --> MacroCmd
graph TB
    subgraph "行为型设计模式"
        Observer["观察者模式<br/>一对多通知"]
        Strategy["策略模式<br/>算法可替换"]
        Command["命令模式<br/>请求封装为对象"]
    end

    subgraph "核心机制"
        PubSub["发布-订阅"]
        Delegation["组合委托"]
        Encapsulation["封装请求"]
    end

    subgraph "典型应用"
        EventDriven["事件驱动系统"]
        Configurable["可配置算法"]
        UndoRedo["撤销/重做"]
        TaskQueue["任务队列"]
        PluginSys["插件系统"]
        MacroCmd["宏命令"]
    end

    Observer --> PubSub
    Strategy --> Delegation
    Command --> Encapsulation

    PubSub --> EventDriven
    PubSub --> PluginSys
    Delegation --> Configurable
    Delegation --> PluginSys
    Encapsulation --> UndoRedo
    Encapsulation --> TaskQueue
    Encapsulation --> MacroCmd

观察者模式内部结构

┌─────────────────────────────────────────────────────────────┐
│                     Event Bus(事件总线)                      │
│                                                              │
│  ┌─────────────┐  register    ┌─────────────────────────┐    │
│  │  Publisher  │────────────▶ │     Event Channel       │    │
│  │  (生产者)    │              │   ┌──────────────────┐  │    │
│  └─────────────┘              │   │ event_type → []   │  │    │
│         │                     │   │ "order.create" →  │  │    │
│         │ publish             │   │   [handler1,      │  │    │
│         ▼                     │   │    handler2]      │  │    │
│  ┌─────────────┐  notify      │   │ "order.pay" →    │  │    │
│  │   Event     │────────────▶ │   │   [handler3]      │  │    │
│  └─────────────┘              │   └──────────────────┘  │    │
│                               └─────────────────────────┘    │
│                                            │                  │
│                                            ▼                  │
│                               ┌─────────────────────────┐    │
│                               │    Subscriber(消费者)    │    │
│                               │  - email_notifier        │    │
│                               │  - sms_notifier          │    │
│                               │  - logger                │    │
│                               └─────────────────────────┘    │
└─────────────────────────────────────────────────────────────┘

策略模式与上下文关系

                          ┌───────────────────┐
                          │    Context        │
                          │  (上下文对象)     │
                          │                   │
                          │  + set_strategy() │
                          │  + execute()      │
                          └────────┬──────────┘
                                   │
                    ┌──────────────┼──────────────┐
                    │              │              │
                    ▼              ▼              ▼
          ┌─────────────────┐ ┌─────────────┐ ┌─────────────┐
          │  Strategy A      │ │ Strategy B  │ │ Strategy C  │
          │  ─────────       │ │ ─────────   │ │ ─────────   │
          │  "简单模式"       │ │ "进阶模式"   │ │ "专家模式"   │
          │  复杂度: O(n)    │ │ 复杂度: O(n²)│ │ 复杂度: O(1)│
          │  准确率: 80%     │ │ 准确率: 95%  │ │ 准确率: 99%  │
          └─────────────────┘ └─────────────┘ └─────────────┘
                         ▲                    ▲
                         │                    │
                         └───── 可互换 ───────┘

命令模式执行流程

时间线 ──────────────────────────────────────────────────▶

① 创建命令            ② 调用执行           ③ 接收者执行
                      
   Client                  Invoker                 Receiver
   │                        │                        │
   │── create cmd ───────▶ │                        │
   │                        │── execute(cmd) ──────▶│
   │                        │                        │── do_action()
   │                        │◀────── result ────────│
   │                        │                        │
   │                        │   ④ 可选:记录、撤销    │
   │                        │── log(cmd) ──────────▶│
   │                        │── undo_queue.push(cmd) │
   │◀───── 返回结果 ────────│                        │

Python 实现建议

python
# ── 抽象基类方案(标准 OOP)──
from abc import ABC, abstractmethod

class Observer(ABC):
    @abstractmethod
    def update(self, data): ...

# ── Protocol 方案(鸭子类型)──
from typing import Protocol

class Observer(Protocol):
    def update(self, data): ...

# ── 函数式方案(轻量级)──
# 直接用 Callable[[Any], None] 替代观察者类
from typing import Callable

Observer = Callable[[Any], None]

三种模式的优劣权衡

quadrantChart title 三种模式对比(抽象程度 vs 实现复杂度) x-axis 低复杂度 --> 高复杂度 y-axis 低抽象 --> 高抽象 quadrant-1 "高抽象高复杂度" quadrant-2 "高抽象低复杂度" quadrant-3 "低抽象低复杂度" quadrant-4 "低抽象高复杂度" "Observer": [0.5, 0.6] "Strategy": [0.4, 0.7] "Command": [0.7, 0.8]
quadrantChart
    title 三种模式对比(抽象程度 vs 实现复杂度)
    x-axis 低复杂度 --> 高复杂度
    y-axis 低抽象 --> 高抽象
    quadrant-1 "高抽象高复杂度"
    quadrant-2 "高抽象低复杂度"
    quadrant-3 "低抽象低复杂度"
    quadrant-4 "低抽象高复杂度"
    "Observer": [0.5, 0.6]
    "Strategy": [0.4, 0.7]
    "Command": [0.7, 0.8]