——对象关系复杂度的结构化管理哲学
在软件系统中,复杂性并非只来源于"逻辑",更多来自于:
结构型模式的核心使命只有一个:
在不破坏系统稳定性的前提下,组织对象之间的关系,以控制复杂度与变化的扩散。
| 不变关注点 | 说明 |
|---|---|
| 接口一致性 | 客户是否能用"统一方式"使用不同对象 |
| 结构组合方式 | 对象如何形成更大的结构单元 |
| 间接层设计 | 是否通过中间层隔离变化与控制依赖 |
结构型模式不是"加功能", 而是 重新组织关系。
| 抽象维度 | 对应模式 |
|---|---|
| 接口转换与统一 | 适配器、外观 |
| 抽象与实现解耦 | 桥接 |
| 递归结构建模 | 组合 |
| 行为叠加 | 装饰器 |
| 间接访问与控制 | 代理、享元 |
通过引入中间转换层,隔离接口不兼容带来的变化。
适配器并不改变已有对象的能力,只改变访问方式。
现实系统中:
直接修改原有类:
适配器 = 变化的缓冲区
classDiagram
Target <|-- Adapter
Adaptee <-- Adapter
Client --> Target
| 类型 | 本质差异 |
|---|---|
| 类适配器 | 通过继承完成接口转换(耦合较高) |
| 对象适配器 | 通过组合完成接口转换(推荐) |
| 接口适配 | 解决"接口过大"的适配问题 |
| 对比点 | 适配器 | 外观 |
|---|---|---|
| 目标 | 解决不兼容 | 简化使用 |
| 是否改变接口 | 是 | 否 |
| 使用动机 | 被动 | 主动 |
将"抽象维度"与"实现维度"解耦,使它们可以独立演化。
桥接模式不是为了解耦类, 而是为了解耦 变化的维度。
当一个类同时沿多个维度变化时:
classDiagram
Abstraction o--> Implementor
RefinedAbstraction --|> Abstraction
ConcreteImplementor --|> Implementor
| 对比点 | 桥接 | 策略 |
|---|---|---|
| 关注点 | 结构维度解耦 | 行为选择 |
| 生命周期 | 长期结构设计 | 运行期决策 |
通过递归一致性,使单个对象与对象组合对客户端透明。
组合模式解决的不是"树", 而是 一致性问题。
classDiagram
Component <|-- Leaf
Component <|-- Composite
Composite o--> Component
Client --> Component
在不改变对象接口与语义的前提下,叠加对象能力。
装饰器不是"代理", 而是 能力增强机制。
继承:
装饰器:
classDiagram
Component <|-- ConcreteComponent
Component <|-- Decorator
Decorator o--> Component
| 对比点 | 装饰器 | 代理 |
|---|---|---|
| 目的 | 增强能力 | 控制访问 |
| 是否改变语义 | 否 | 否 |
| 关注点 | 功能叠加 | 权限/治理 |
为复杂子系统提供一个认知友好的统一入口。
外观模式解决的是: "系统可用性"而非"系统能力"。
classDiagram
Facade --> SubSystemA
Facade --> SubSystemB
Client --> Facade
通过分离可共享状态与不可共享状态,降低对象数量成本。
classDiagram
FlyweightFactory --> Flyweight
Client --> FlyweightFactory
通过引入间接层,控制对象的访问方式与访问时机。
classDiagram
Subject <|-- RealSubject
Subject <|-- Proxy
Proxy o--> RealSubject
Client --> Subject
这是一个 工程演进与代码生成隔离模式, 而非经典结构型模式。
通过继承层次隔离"生成代码"与"手写代码"的变化。
| 问题 | 应对策略 |
|---|---|
| 生成代码被修改 | 禁止修改 |
| 需求变化 | 差异计算 |
| 频繁再生成 | 隐藏生成细节 |
| 模式 | 解决核心问题 | 是否改变接口 | 是否增强能力 |
|---|---|---|---|
| 适配器 | 接口不兼容 | 是 | 否 |
| 外观 | 使用复杂 | 否 | 否 |
| 桥接 | 多维变化 | 否 | 否 |
| 组合 | 结构一致性 | 否 | 否 |
| 装饰器 | 能力扩展 | 否 | 是 |
| 代理 | 访问控制 | 否 | 可选 |
| 享元 | 性能/内存 | 否 | 否 |