Skip to content

4.0 简介:结构型模式 (Structural Patterns)

欢迎来到设计模式的第二个主要类别——结构型模式。

在上一章“创建型模式”中,我们专注于解决对象“如何被创建”的问题。现在,我们假设对象已经被创建出来了,接下来面临一个更宏大的问题:

“如何将这些独立的对象和类,像搭积木一样,组装成更大、更灵活、更强大的结构?”

这就是结构型模式要回答的核心问题。

一、问题的根源:系统复杂性带来的挑战

随着软件功能的迭代,系统会变得越来越复杂。我们会遇到各种各样的问题:

  • 接口不兼容:一个功能强大的第三方库,它的接口和我们的现有系统完全对不上,怎么办?
  • 功能扩展:如何为一个已经存在的类增加新的功能,但又不想(或不能)修改它的源代码?
  • 系统臃肿:一个子系统内部包含了十几个类,调用关系错综复杂,外部使用者每次调用都感到痛苦不堪,怎么办?

如果我们每次都通过修改已有代码来应对这些变化,系统很快就会变得像一盘意大利面——混乱、脆弱,牵一发而动全身。

二、核心思想:关注“结构”,而非“功能”

所有结构型模式的“初心”,都不是去创造全新的功能,而是去优化和管理不同部分之间的“结构关系”

它们的核心思想是:

在不改变各个独立组件(类或对象)内部的情况下,通过引入中间层、改变组合方式等手段,来调整它们之间的连接和协作方式,从而让整个系统更加灵活和强大。

核心比喻:乐高积木 (LEGO)

结构型模式就像乐高积木的玩法:

  • 积木块 (对象/类):每一块积木都有自己的形状和功能。
  • 凸点和凹槽 (接口):这是乐高积木能够相互连接的标准。
  • 结构型模式 (拼装技巧)
    • 你可能需要一个转接块适配器模式),让两种不同系列的积木能拼在一起。
    • 你可能用几块小积木搭一个“外壳”代理模式装饰器模式),让里面的核心积木看起来更酷或拥有“防护罩”。
    • 你可能把一堆复杂的零件预先组装成一个“引擎模块”,只留一个简单的接口给外部(外观模式)。

最终,你利用这些技巧,将一个个独立的积木块,搭建成一座宏伟的城堡(一个健壮的软件系统)。

这种思想的好处是,它让我们的系统组件保持了独立性可复用性,同时又赋予了整个系统极大的灵活性来应对变化。

三、本章学习地图

在本章,我们将学习以下几个在 JavaScript 开发中应用最广泛的结构型模式:

  1. 适配器模式 (Adapter Pattern)

    • 一句话简介:像一个“电源转接头”,让两个接口不兼容的对象能够协同工作。
  2. 代理模式 (Proxy Pattern)

    • 一句话简介:像明星的“经纪人”,为目标对象提供一个替身或占位符,以控制对这个对象的访问。
  3. 外观模式 (Facade Pattern)

    • 一句话简介:像酒店的“前台”,为一大堆复杂的子系统提供一个统一、简洁的入口。
  4. 组合模式 (Composite Pattern)

    • 一句话简介:像电脑里的“文件夹”,让你能够以同样的方式对待单个文件和整个文件夹(即单个对象和对象组合)。

我们之前在“核心入门模式”中学过的 装饰器模式 也属于结构型模式。通过本章的学习,你将掌握一套强大的“拼装”和“重构”技巧,让你的代码结构更加清晰和优雅。