← 返回首页
🔄

行为型模式

📂 python ⏱ 5 min 930 words

行为型模式

行为型模式关注对象之间的通信和职责分配。本文将介绍四种重要的行为型模式:策略、命令、状态和责任链模式。

策略模式

策略模式定义一系列算法,将每个算法封装起来,并使它们可以相互替换。

from abc import ABC, abstractmethod
from typing import List, Callable

class SortStrategy(ABC):
    """排序策略接口"""
    
    @abstractmethod
    def sort(self, data: List[int]) -> List[int]:
        pass

class BubbleSortStrategy(SortStrategy):
    """冒泡排序策略"""
    
    def sort(self, data: List[int]) -> List[int]:
        arr = data.copy()
        n = len(arr)
        for i in range(n):
            for j in range(0, n-i-1):
                if arr[j] > arr[j+1]:
                    arr[j], arr[j+1] = arr[j+1], arr[j]
        return arr

class QuickSortStrategy(SortStrategy):
    """快速排序策略"""
    
    def sort(self, data: List[int]) -> List[int]:
        if len(data) <= 1:
            return data
        pivot = data[len(data) // 2]
        left = [x for x in data if x < pivot]
        middle = [x for x in data if x == pivot]
        right = [x for x in data if x > pivot]
        return self.sort(left) + middle + self.sort(right)

class InsertionSortStrategy(SortStrategy):
    """插入排序策略"""
    
    def sort(self, data: List[int]) -> List[int]:
        arr = data.copy()
        for i in range(1, len(arr)):
            key = arr[i]
            j = i - 1
            while j >= 0 and key < arr[j]:
                arr[j + 1] = arr[j]
                j -= 1
            arr[j + 1] = key
        return arr

class Sorter:
    """排序器,使用策略模式"""
    
    def __init__(self, strategy: SortStrategy):
        self._strategy = strategy
    
    def set_strategy(self, strategy: SortStrategy):
        self._strategy = strategy
    
    def sort(self, data: List[int]) -> List[int]:
        return self._strategy.sort(data)

# 使用
data = [64, 34, 25, 12, 22, 11, 90]

sorter = Sorter(BubbleSortStrategy())
print(f"冒泡排序: {sorter.sort(data)}")

sorter.set_strategy(QuickSortStrategy())
print(f"快速排序: {sorter.sort(data)}")

# 使用函数作为策略
def python_builtin_sort(data: List[int]) -> List[int]:
    return sorted(data)

# 策略也可以是函数
sorter.set_strategy(python_builtin_sort)
print(f"内置排序: {sorter.sort(data)}")

命令模式

命令模式将请求封装成对象,支持参数化、排队、日志记录和事务支持。

from abc import ABC, abstractmethod
from typing import List, Optional
from datetime import datetime

class Command(ABC):
    """命令接口"""
    
    @abstractmethod
    def execute(self) -> str:
        pass
    
    @abstractmethod
    def undo(self) -> str:
        pass
    
    @abstractmethod
    def description(self) -> str:
        pass

class TextEditor:
    """文本编辑器"""
    
    def __init__(self):
        self.content = ""
    
    def insert(self, text: str, position: int):
        self.content = self.content[:position] + text + self.content[position:]
    
    def delete(self, position: int, length: int) -> str:
        deleted = self.content[position:position+length]
        self.content = self.content[:position] + self.content[position+length:]
        return deleted

class InsertCommand(Command):
    """插入命令"""
    
    def __init__(self, editor: TextEditor, text: str, position: int):
        self.editor = editor
        self.text = text
        self.position = position
    
    def execute(self) -> str:
        self.editor.insert(self.text, self.position)
        return f"插入 '{self.text}' 到位置 {self.position}"
    
    def undo(self) -> str:
        self.editor.delete(self.position, len(self.text))
        return f"撤销插入 '{self.text}'"
    
    def description(self) -> str:
        return f"InsertCommand('{self.text}', {self.position})"

class DeleteCommand(Command):
    """删除命令"""
    
    def __init__(self, editor: TextEditor, position: int, length: int):
        self.editor = editor
        self.position = position
        self.length = length
        self.deleted_text = ""
    
    def execute(self) -> str:
        self.deleted_text = self.editor.delete(self.position, self.length)
        return f"删除 '{self.deleted_text}'"
    
    def undo(self) -> str:
        self.editor.insert(self.deleted_text, self.position)
        return f"恢复 '{self.deleted_text}'"
    
    def description(self) -> str:
        return f"DeleteCommand({self.position}, {self.length})"

class CommandHistory:
    """命令历史记录"""
    
    def __init__(self):
        self._history: List[Command] = []
        self._redo_stack: List[Command] = []
    
    def execute(self, command: Command) -> str:
        result = command.execute()
        self._history.append(command)
        self._redo_stack.clear()
        return result
    
    def undo(self) -> Optional[str]:
        if not self._history:
            return None
        command = self._history.pop()
        result = command.undo()
        self._redo_stack.append(command)
        return result
    
    def redo(self) -> Optional[str]:
        if not self._redo_stack:
            return None
        command = self._redo_stack.pop()
        result = command.execute()
        self._history.append(command)
        return result

# 使用
editor = TextEditor()
history = CommandHistory()

print(history.execute(InsertCommand(editor, "Hello", 0)))
print(f"内容: '{editor.content}'")  # 'Hello'

print(history.execute(InsertCommand(editor, " World", 5)))
print(f"内容: '{editor.content}'")  # 'Hello World'

print(history.execute(DeleteCommand(editor, 5, 6)))
print(f"内容: '{editor.content}'")  # 'Hello'

print(history.undo())  # 撤销删除
print(f"内容: '{editor.content}'")  # 'Hello World'

print(history.redo())  # 重做删除
print(f"内容: '{editor.content}'")  # 'Hello'

状态模式

状态模式允许对象在内部状态改变时改变其行为。

from abc import ABC, abstractmethod
from typing import Optional

class OrderState(ABC):
    """订单状态接口"""
    
    @abstractmethod
    def next(self, order: 'Order') -> Optional['OrderState']:
        pass
    
    @abstractmethod
    def cancel(self, order: 'Order') -> Optional['OrderState']:
        pass
    
    @abstractmethod
    def status(self) -> str:
        pass

class PendingState(OrderState):
    """待处理状态"""
    
    def next(self, order: 'Order') -> Optional['OrderState']:
        print("订单确认,开始处理")
        return ProcessingState()
    
    def cancel(self, order: 'Order') -> Optional['OrderState']:
        print("订单已取消")
        return CancelledState()
    
    def status(self) -> str:
        return "待处理"

class ProcessingState(OrderState):
    """处理中状态"""
    
    def next(self, order: 'Order') -> Optional['OrderState']:
        print("订单处理完成,准备发货")
        return ShippedState()
    
    def cancel(self, order: 'Order') -> Optional['OrderState']:
        print("订单处理中无法取消,将进行退款处理")
        return RefundedState()
    
    def status(self) -> str:
        return "处理中"

class ShippedState(OrderState):
    """已发货状态"""
    
    def next(self, order: 'Order') -> Optional['OrderState']:
        print("订单已送达")
        return DeliveredState()
    
    def cancel(self, order: 'Order') -> Optional['OrderState']:
        print("已发货无法取消,请拒收或申请退货")
        return self
    
    def status(self) -> str:
        return "已发货"

class DeliveredState(OrderState):
    """已送达状态"""
    
    def next(self, order: 'Order') -> Optional['OrderState']:
        print("订单已完成")
        return CompletedState()
    
    def cancel(self, order: 'Order') -> Optional['OrderState']:
        print("已送达,请申请退货")
        return self
    
    def status(self) -> str:
        return "已送达"

class CompletedState(OrderState):
    """已完成状态"""
    
    def next(self, order: 'Order') -> Optional['OrderState']:
        print("订单已完成,无法继续")
        return self
    
    def cancel(self, order: 'Order') -> Optional['OrderState']:
        print("订单已完成,无法取消")
        return self
    
    def status(self) -> str:
        return "已完成"

class CancelledState(OrderState):
    """已取消状态"""
    
    def next(self, order: 'Order') -> Optional['OrderState']:
        print("订单已取消,无法继续")
        return self
    
    def cancel(self, order: 'Order') -> Optional['OrderState']:
        print("订单已取消")
        return self
    
    def status(self) -> str:
        return "已取消"

class RefundedState(OrderState):
    """已退款状态"""
    
    def next(self, order: 'Order') -> Optional['OrderState']:
        print("订单已退款,无法继续")
        return self
    
    def cancel(self, order: 'Order') -> Optional['OrderState']:
        print("订单已退款")
        return self
    
    def status(self) -> str:
        return "已退款"

class Order:
    """订单类"""
    
    def __init__(self, order_id: str):
        self.order_id = order_id
        self._state: OrderState = PendingState()
    
    def next_state(self):
        new_state = self._state.next(self)
        if new_state:
            self._state = new_state
    
    def cancel(self):
        new_state = self._state.cancel(self)
        if new_state:
            self._state = new_state
    
    def get_status(self) -> str:
        return self._state.status()

# 使用
order = Order("ORD001")
print(f"状态: {order.get_status()}")  # 待处理

order.next_state()  # 订单确认,开始处理
print(f"状态: {order.get_status()}")  # 处理中

order.next_state()  # 订单处理完成,准备发货
print(f"状态: {order.get_status()}")  # 已发货

责任链模式

责任链模式为请求创建一个处理者链,每个处理者决定处理请求或传递给下一个处理者。

from abc import ABC, abstractmethod
from typing import Optional

class Handler(ABC):
    """处理器接口"""
    
    def __init__(self):
        self._next: Optional[Handler] = None
    
    def set_next(self, handler: 'Handler') -> 'Handler':
        self._next = handler
        return handler
    
    @abstractmethod
    def handle(self, request: dict) -> Optional[str]:
        pass

class AuthenticationHandler(Handler):
    """认证处理器"""
    
    def handle(self, request: dict) -> Optional[str]:
        if not request.get("token"):
            return "认证失败: 缺少令牌"
        
        if request["token"] != "valid_token":
            return "认证失败: 无效令牌"
        
        print("认证通过")
        if self._next:
            return self._next.handle(request)
        return None

class AuthorizationHandler(Handler):
    """授权处理器"""
    
    def handle(self, request: dict) -> Optional[str]:
        role = request.get("role")
        if role not in ["admin", "user"]:
            return f"授权失败: 未知角色 {role}"
        
        required_role = request.get("required_role", "user")
        if role != "admin" and required_role == "admin":
            return "授权失败: 需要管理员权限"
        
        print("授权通过")
        if self._next:
            return self._next.handle(request)
        return None

class RateLimitHandler(Handler):
    """限流处理器"""
    
    def __init__(self, max_requests: int = 100):
        super().__init__()
        self.request_count = 0
        self.max_requests = max_requests
    
    def handle(self, request: dict) -> Optional[str]:
        self.request_count += 1
        if self.request_count > self.max_requests:
            return "限流: 请求过于频繁"
        
        print(f"限流检查通过 ({self.request_count}/{self.max_requests})")
        if self._next:
            return self._next.handle(request)
        return None

# 构建处理链
auth = AuthenticationHandler()
authz = AuthorizationHandler()
rate_limit = RateLimitHandler(max_requests=3)

auth.set_next(authz).set_next(rate_limit)

# 测试
request1 = {"token": "valid_token", "role": "admin"}
print(auth.handle(request1))

print("\n---")
request2 = {"token": "invalid_token", "role": "user"}
print(auth.handle(request2))

print("\n---")
request3 = {"token": "valid_token", "role": "guest"}
print(auth.handle(request3))

模式对比

模式 核心思想 应用场景
策略 算法可互换 排序、定价、验证规则
命令 撤销/重做 编辑器、事务、任务队列
状态 行为随状态变 订单流程、游戏状态、工作流
责任链 传递请求 中间件、审批流程、事件处理

行为型模式的关键是管理对象间的协作:策略封装算法,命令封装动作,状态封装行为变化,责任链封装处理流程。