这本《设计模式》,我读了 3 遍才理解:从"写代码"到"造系统"的思维跃迁

3 阅读8分钟

在 AI 能帮你写代码的 2026 年,为什么还要读这本 1994 年的经典?

技术背景:AI 编程时代的"模式觉醒"

2026 年,Claude Code、Cursor 这些 AI 编程助手已经能生成相当完整的代码。但一个有趣的现象正在发生:越是依赖 AI 生成代码的团队,越开始重视设计模式

为什么?

因为 AI 生成的代码往往是"功能导向"的——能跑就行,但缺乏系统性思考。当你让 AI "帮我写一个用户管理系统",它给你的是一堆散乱的函数,而不是一个清晰的架构。

这时候,《设计模式:可复用面向对象软件的基础》(GoF 设计模式)的价值被重新激活了——它不是教你写代码,而是教你造系统

书籍核心内容:23 种模式的底层逻辑

这本书由四位作者(被称为 GoF——Gang of Four)于 1994 年出版,定义了 23 种经典设计模式,分为三大类:

创建型模式(5 种)

处理对象创建的问题,让系统更灵活地决定"何时创建什么":

  • 单例模式(Singleton):确保一个类只有一个实例
  • 工厂方法模式(Factory Method):让子类决定创建什么对象
  • 抽象工厂模式(Abstract Factory):创建相关对象家族
  • 建造者模式(Builder):分步构建复杂对象
  • 原型模式(Prototype):通过复制创建新对象

结构型模式(7 种)

处理类和对象的组合问题:

  • 适配器模式(Adapter):让不兼容的接口能协同工作
  • 装饰器模式(Decorator):动态添加功能
  • 代理模式(Proxy):控制对象的访问
  • 外观模式(Facade):简化复杂系统的接口
  • 组合模式(Composite):树形结构的统一处理
  • 桥接模式(Bridge):分离抽象与实现
  • 享元模式(Flyweight):共享细粒度对象

行为型模式(11 种)

处理对象间的通信和职责分配:

  • 策略模式(Strategy):定义算法族,可相互替换
  • 观察者模式(Observer):对象间的依赖通知
  • 命令模式(Command):将请求封装为对象
  • 模板方法模式(Template Method):定义算法骨架
  • 迭代器模式(Iterator):遍历聚合对象
  • 责任链模式(Chain of Responsibility):请求沿链传递
  • 状态模式(State):状态驱动的行为变化
  • 中介者模式(Mediator):集中管理对象交互
  • 备忘录模式(Memento):保存和恢复对象状态
  • 访问者模式(Visitor):分离数据结构与操作

代码示例:策略模式在 AI Agent 工具编排中的应用

下面我用策略模式设计一个 AI Agent 的工具选择器——这正是当下热门的 Agent 架构场景:

from abc import ABC, abstractmethod
from typing import Dict, Any
import json

# 策略接口:定义工具执行的统一契约
class ToolStrategy(ABC):
    """工具策略的抽象基类"""
    
    @abstractmethod
    def execute(self, params: Dict[str, Any]) -> Dict[str, Any]:
        """执行工具并返回结果"""
        pass
    
    @abstractmethod
    def get_tool_name(self) -> str:
        """返回工具名称"""
        pass

# 具体策略:搜索引擎工具
class SearchTool(ToolStrategy):
    def get_tool_name(self) -> str:
        return "web_search"
    
    def execute(self, params: Dict[str, Any]) -> Dict[str, Any]:
        query = params.get("query", "")
        # 模拟搜索逻辑
        return {
            "success": True,
            "results": [
                {"title": f"搜索结果: {query}", "url": "https://example.com"}
            ],
            "tool_used": self.get_tool_name()
        }

# 具体策略:代码生成工具
class CodeGenTool(ToolStrategy):
    def get_tool_name(self) -> str:
        return "code_generator"
    
    def execute(self, params: Dict[str, Any]) -> Dict[str, Any]:
        prompt = params.get("prompt", "")
        language = params.get("language", "python")
        # 模拟代码生成
        generated_code = f"# Generated {language} code\n# Prompt: {prompt}\npass"
        return {
            "success": True,
            "code": generated_code,
            "language": language,
            "tool_used": self.get_tool_name()
        }

# 具体策略:数据库查询工具
class DatabaseTool(ToolStrategy):
    def get_tool_name(self) -> str:
        return "db_query"
    
    def execute(self, params: Dict[str, Any]) -> Dict[str, Any]:
        sql = params.get("sql", "")
        # 模拟数据库查询
        return {
            "success": True,
            "rows": [{"id": 1, "data": "sample"}],
            "sql": sql,
            "tool_used": self.get_tool_name()
        }

# 策略上下文:Agent 工具编排器
class AgentToolOrchestrator:
    """
    AI Agent 的工具编排器
    使用策略模式实现工具的灵活切换和扩展
    """
    
    def __init__(self):
        # 工具注册表:存储所有可用策略
        self._tools: Dict[str, ToolStrategy] = {}
    
    def register_tool(self, tool: ToolStrategy) -> None:
        """注册新工具策略"""
        self._tools[tool.get_tool_name()] = tool
        print(f"✅ 已注册工具: {tool.get_tool_name()}")
    
    def execute_tool(self, tool_name: str, params: Dict[str, Any]) -> Dict[str, Any]:
        """
        根据策略名称执行对应工具
        这是策略模式的核心:调用方不需要知道具体实现
        """
        if tool_name not in self._tools:
            return {"success": False, "error": f"工具 {tool_name} 未注册"}
        
        tool = self._tools[tool_name]
        print(f"🔧 执行工具: {tool_name}")
        return tool.execute(params)
    
    def list_available_tools(self) -> list:
        """列出所有可用工具"""
        return list(self._tools.keys())

# AI Agent 主控逻辑
class AIAgent:
    """使用策略模式的 AI Agent"""
    
    def __init__(self):
        self.orchestrator = AgentToolOrchestrator()
        self._setup_default_tools()
    
    def _setup_default_tools(self) -> None:
        """初始化默认工具集"""
        self.orchestrator.register_tool(SearchTool())
        self.orchestrator.register_tool(CodeGenTool())
        self.orchestrator.register_tool(DatabaseTool())
    
    def process_request(self, user_input: str) -> str:
        """
        处理用户请求,自动选择合适的工具
        模拟 Agent 的工具选择决策
        """
        # 简单的意图识别逻辑
        if "搜索" in user_input or "查一下" in user_input:
            result = self.orchestrator.execute_tool("web_search", {"query": user_input})
            return json.dumps(result, indent=2, ensure_ascii=False)
        
        elif "写代码" in user_input or "生成" in user_input:
            result = self.orchestrator.execute_tool("code_generator", {"prompt": user_input})
            return json.dumps(result, indent=2, ensure_ascii=False)
        
        elif "数据库" in user_input or "查询数据" in user_input:
            result = self.orchestrator.execute_tool("db_query", {"sql": "SELECT * FROM users"})
            return json.dumps(result, indent=2, ensure_ascii=False)
        
        else:
            return f"可用工具: {self.orchestrator.list_available_tools()}\n请明确你的需求。"

# ============ 使用示例 ============
if __name__ == "__main__":
    # 创建 Agent
    agent = AIAgent()
    
    # 测试不同场景
    print("\n--- 测试 1: 搜索请求 ---")
    response1 = agent.process_request("帮我搜索最新的 AI 编程工具")
    print(response1)
    
    print("\n--- 测试 2: 代码生成请求 ---")
    response2 = agent.process_request("帮我写代码实现一个简单的 HTTP 服务器")
    print(response2)
    
    print("\n--- 测试 3: 数据库请求 ---")
    response3 = agent.process_request("从数据库查询用户数据")
    print(response3)
    
    print("\n--- 测试 4: 动态注册新工具 ---")
    # 新增工具:不修改现有代码,只需注册新策略
    class WeatherTool(ToolStrategy):
        def get_tool_name(self) -> str:
            return "weather_query"
        
        def execute(self, params: Dict[str, Any]) -> Dict[str, Any]:
            city = params.get("city", "北京")
            return {
                "success": True,
                "city": city,
                "weather": "晴朗,25°C",
                "tool_used": self.get_tool_name()
            }
    
    agent.orchestrator.register_tool(WeatherTool())
    print(f"现在可用工具: {agent.orchestrator.list_available_tools()}")

这个代码展示了策略模式的三个核心价值:

  1. 开闭原则:新增 WeatherTool 时,无需修改 AgentToolOrchestratorAIAgent 的代码——只需注册新策略
  2. 单一职责:每个工具类只负责自己的执行逻辑,Orchestrator 只负责调度
  3. 依赖倒置AIAgent 依赖的是抽象接口 ToolStrategy,而不是具体实现

个人实践心得:三遍阅读的认知跃迁

第一遍:2020 年——"这是什么黑魔法?"

第一次读这本书时,我正处于"能写代码但不懂设计"的阶段。书中那些 UML 图、类名之间的箭头关系让我头昏脑涨。我把每一章都当作"必学知识"硬啃,结果读完就忘。

那时候的误区:把设计模式当作"标准答案",以为学会就能写出好代码。

第二遍:2023 年——"原来是在解决特定问题"

第二次阅读时,我已经踩过足够多的坑。读到"装饰器模式"时,我突然理解了——这不就是我之前写日志框架时,用层层嵌套实现功能叠加的方式吗?

关键转变:不再问"这是什么模式",而是问"这个模式解决了什么痛点"

模式解决的痛点我的实际场景
单例全局唯一实例管理配置管理器、日志器
工厂方法创建逻辑解耦多数据库适配器切换
观察者事件通知解耦消息推送系统
策略算法灵活切换支付方式选择、工具编排
适配器接口兼容第三方 API 接入

第三遍:2026 年——"AI 编程时代的模式觉醒"

今年第三次阅读时,我正在研究 AI Agent 工具编排架构。突然发现:策略模式、责任链模式、命令模式,几乎是 Agent 工具系统的标配

当 AI 开始帮你写代码时,设计模式的价值反而更高了:

  • AI 生成的代码往往是"功能堆砌",没有架构意识
  • 你需要用设计模式告诉 AI:"按这个结构来组织代码"
  • 设计模式成为你与 AI 协作的"沟通协议"

适合人群与阅读建议

适合人群

人群阅读价值建议方式
初学者(< 2 年经验)建立设计思维萌芽先读《Head First 设计模式》,更通俗
中级开发者(2-5 年)解决实际架构痛点选择性阅读,带着问题找答案
高级开发者(> 5 年)系统化知识沉淀通读后建立自己的模式库
AI 编程从业者工具编排、Agent架构重点读策略、命令、责任链模式

阅读建议

  1. 不要从头到尾硬啃——这本书不是小说,是工具书
  2. 带着问题读——先问"我遇到了什么设计难题",再去书中找答案
  3. 手写代码验证——光看 UML 图没用,必须写代码才能理解
  4. 结合实际项目——把书中的模式应用到你正在写的代码中
  5. 与 AI 协作——让 AI 帮你"用 XX 模式重构这段代码",然后对比结果

结语:经典书的"时代穿越"能力

在技术领域,很多书籍"出版即过时"。但《设计模式》穿越了 30 年,依然在 AI 编程时代发光。

它的生命力来自一个本质:它不是讲某个语言或框架的技巧,而是讲系统设计的底层法则。语言会变,框架会换代,但"如何让代码组合得更灵活、更可扩展"这个问题,永远不会消失。

所以,当 AI 能帮你写代码时,你更需要这本书——因为 AI 写的是代码,而你造的是系统


讨论:你在实际项目中用过哪些设计模式?有没有"踩坑后才理解模式价值"的经历?欢迎留言分享。

声明:本文为技术书评,无联盟推广链接。