Appearance
4.0 简介:结构型模式 (Structural Patterns)
欢迎来到设计模式的第二个主要类别——结构型模式。
在上一章“创建型模式”中,我们专注于解决对象“如何被创建”的问题。现在,我们假设对象已经被创建出来了,接下来面临一个更宏大的问题:
“如何将这些独立的对象和类,像搭积木一样,组装成更大、更灵活、更强大的结构?”
这就是结构型模式要回答的核心问题。
一、问题的根源:系统复杂性带来的挑战
随着软件功能的迭代,系统会变得越来越复杂。我们会遇到各种各样的问题:
- 接口不兼容:一个功能强大的第三方库,它的接口和我们的现有系统完全对不上,怎么办?
- 功能扩展:如何为一个已经存在的类增加新的功能,但又不想(或不能)修改它的源代码?
- 系统臃肿:一个子系统内部包含了十几个类,调用关系错综复杂,外部使用者每次调用都感到痛苦不堪,怎么办?
如果我们每次都通过修改已有代码来应对这些变化,系统很快就会变得像一盘意大利面——混乱、脆弱,牵一发而动全身。
二、核心思想:关注“结构”,而非“功能”
所有结构型模式的“初心”,都不是去创造全新的功能,而是去优化和管理不同部分之间的“结构关系”。
它们的核心思想是:
在不改变各个独立组件(类或对象)内部的情况下,通过引入中间层、改变组合方式等手段,来调整它们之间的连接和协作方式,从而让整个系统更加灵活和强大。
核心比喻:乐高积木 (LEGO)
结构型模式就像乐高积木的玩法:
- 积木块 (对象/类):每一块积木都有自己的形状和功能。
- 凸点和凹槽 (接口):这是乐高积木能够相互连接的标准。
- 结构型模式 (拼装技巧):
- 你可能需要一个转接块(适配器模式),让两种不同系列的积木能拼在一起。
- 你可能用几块小积木搭一个“外壳”(代理模式或装饰器模式),让里面的核心积木看起来更酷或拥有“防护罩”。
- 你可能把一堆复杂的零件预先组装成一个“引擎模块”,只留一个简单的接口给外部(外观模式)。
最终,你利用这些技巧,将一个个独立的积木块,搭建成一座宏伟的城堡(一个健壮的软件系统)。
这种思想的好处是,它让我们的系统组件保持了独立性和可复用性,同时又赋予了整个系统极大的灵活性来应对变化。
三、本章学习地图
在本章,我们将学习以下几个在 JavaScript 开发中应用最广泛的结构型模式:
适配器模式 (Adapter Pattern)
- 一句话简介:像一个“电源转接头”,让两个接口不兼容的对象能够协同工作。
代理模式 (Proxy Pattern)
- 一句话简介:像明星的“经纪人”,为目标对象提供一个替身或占位符,以控制对这个对象的访问。
外观模式 (Facade Pattern)
- 一句话简介:像酒店的“前台”,为一大堆复杂的子系统提供一个统一、简洁的入口。
组合模式 (Composite Pattern)
- 一句话简介:像电脑里的“文件夹”,让你能够以同样的方式对待单个文件和整个文件夹(即单个对象和对象组合)。
我们之前在“核心入门模式”中学过的 装饰器模式 也属于结构型模式。通过本章的学习,你将掌握一套强大的“拼装”和“重构”技巧,让你的代码结构更加清晰和优雅。