Skip to content

1.2 什么是设计模式?

在上一章,我们通过一个权限判断的例子,直观地感受到了“策略模式”如何让我们的代码变得更清晰、更易于扩展。我们看到,一个好的“套路”能显著提升代码质量。

现在,让我们正式地揭开“设计模式”的神秘面纱。

一、再谈“菜谱”:模式是一种思想,不是代码

想象一下你拿到了一份“宫保鸡丁”的菜谱。

  • 菜谱告诉你需要哪些原料(鸡丁、花生米、葱、姜、蒜...)。
  • 菜谱告诉你步骤方法(先切丁、再腌制、调酱汁、控制火候...)。
  • 菜-谱告诉你最终会得到一份什么样的菜(酸甜可口、香辣开胃)。

但是,这份菜谱并不会

  • 提供给你已经切好的鸡丁或者炒好的花生米。
  • 限制你必须用哪个牌子的酱油或者哪个产地的辣椒。

设计模式就像是这份菜谱。它是一种思想指导解决方案蓝图,而不是一段可以让你直接复制粘贴的代码。

权威定义:设计模式(Design Pattern)是在软件设计中,对一类常见问题的、可复用的、经过验证的解决方案。

这个定义包含几个关键词:

  • 常见问题:它解决的不是某个犄角旮旯的特殊问题,而是我们在开发中反复遇到的问题(比如上一章的“如何优雅地处理多分支逻辑”)。
  • 解决方案:它提供了一套经过前人验证的、行之有效的“做法”。
  • 可复用:这种“做法”可以在不同的项目中被反复使用。

所以,学习设计模式,不是为了背诵代码,而是为了学习解决问题的思路和代码组织结构。当你掌握了“策略模式”这个“菜谱”,无论是做权限判断、表单验证还是价格计算,你都可以游刃有余。

二、设计模式的四个基本要素

为了让一个“菜谱”能被所有人看懂,它通常会包含几个固定部分,比如“菜品名称”、“所需材料”、“烹饪步骤”和“成品特点”。

同样,一个完整的设计模式也由四个基本要素构成:

  1. 模式名称 (Pattern Name) 一个好的名字至关重要。它能帮助我们用一两个词就准确地描述一个复杂的设计思想,极大地提高了沟通效率。当你和同事说“这里可以用单例模式”,他就立刻明白了你的意图。

  2. 问题 (Problem) 描述了该模式旨在解决的应用场景。它解释了问题本身,以及在何种情况下应该考虑使用这个模式。

  3. 解决方案 (Solution) 描述了组成设计的各个部分,以及它们之间的关系、职责和协作方式。这部分是模式的核心,是抽象的“蓝图”,它不涉及具体的实现代码。

  4. 效果 (Consequences) 描述了应用该模式后带来的结果优点缺点。这是帮助我们做技术选型的重要依据。没有任何模式是“银弹”,了解它的“副作用”和局限性,与了解它的优点同样重要。

在本手册的后续章节中,我们介绍每一种模式时,都会围绕这四个核心要素展开。

三、设计模式的三大分类:你的学习地图

上世纪 90 年代,四位顶尖的软件工程师(被称为:Gang of Four, GoF)总结并出版了《设计模式:可复用面向对象软件的基础》一书,其中整理了 23 种经典的设计模式。

为了便于理解和学习,他们将这 23 种模式分为了三大类。这就像是一张地图,指引我们探索整个设计模式的世界。

  1. 创建型模式 (Creational Patterns)

    • 关注点:如何创建对象
    • 目标:将对象的创建与使用相分离,使得系统在不知道对象具体类型的情况下,也能灵活地创建所需的对象。
    • 通俗比喻:就像一个“造车厂”,你只需要告诉工厂你需要一辆“运动型”还是“家庭型”的车,而不需要关心车轮、引擎、座椅是如何被组装起来的。
    • 代表模式:工厂模式、单例模式、建造者模式等。
  2. 结构型模式 (Structural Patterns)

    • 关注点:如何组合对象和类
    • 目标:通过组织和拼接不同的对象和类,来形成更大、更灵活的结构。
    • 通俗比喻:就像“乐高积木”或者“电源适配器”。它们通过标准的接口,将原本不相关的部分组合在一起,协同工作。
    • 代表模式:适配器模式、装饰器模式、代理模式等。
  3. 行为型模式 (Behavioral Patterns)

    • 关注点:对象之间的通信和职责分配
    • 目标:有效地组织对象之间的协作,明确它们各自的职责,降低系统的耦合度。
    • 通俗比喻:就像一个公司的“工作流程”,一个请求从一个部门流转到下一个部门,每个部门只做自己的事,最终共同完成任务。
    • 代表模式:策略模式、观察者模式、迭代器模式等。

四、总结

  • 设计模式是解决常见问题的“套路”或“菜谱”,它是一种思想,而非具体代码。
  • 每个模式都包含名称、问题、解决方案、效果四个要素。
  • 所有经典模式被分为创建型、结构型、行为型三大类。

现在,你已经对设计模式有了宏观的认识。不过,要深入理解许多设计模式,我们需要先对“面向对象编程”(OOP)的一些核心概念有所了解,因为这些模式最初是为面向对象的语言设计的。