如何使用结构型模式

发布时间:2021-10-12 09:40:36 作者:iii
来源:亿速云 阅读:122
# 如何使用结构型模式

## 目录
1. [结构型模式概述](#结构型模式概述)  
2. [适配器模式(Adapter)](#适配器模式adapter)  
3. [桥接模式(Bridge)](#桥接模式bridge)  
4. [组合模式(Composite)](#组合模式composite)  
5. [装饰器模式(Decorator)](#装饰器模式decorator)  
6. [外观模式(Facade)](#外观模式facade)  
7. [享元模式(Flyweight)](#享元模式flyweight)  
8. [代理模式(Proxy)](#代理模式proxy)  
9. [模式对比与选型指南](#模式对比与选型指南)  
10. [实际应用案例分析](#实际应用案例分析)  
11. [总结](#总结)  

---

## 结构型模式概述
结构型模式(Structural Patterns)关注如何将类或对象组合成更大的结构,分为**类结构型模式**(通过继承)和**对象结构型模式**(通过组合)。主要解决系统模块间的耦合问题,提升扩展性和复用性。

### 核心目标
- 解耦组件依赖
- 简化复杂系统结构
- 优化资源利用效率

---

## 适配器模式(Adapter)
**意图**:使接口不兼容的对象能够协同工作

### 实现方式
#### 类适配器(继承)
```java
class Adaptee {
    void specificRequest() { /* 原有实现 */ }
}

class Adapter extends Adaptee implements Target {
    public void request() {
        specificRequest();
    }
}

对象适配器(组合)

class Adapter implements Target {
    private Adaptee adaptee;
    
    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }
    
    public void request() {
        adaptee.specificRequest();
    }
}

应用场景


桥接模式(Bridge)

意图:将抽象与实现分离,使二者可以独立变化

UML结构

          +-------------------+       +-------------------+
          |      Abstraction |<>---->|    Implementor    |
          +-------------------+       +-------------------+
          | operation()       |       | operationImpl()  |
          +-------------------+       +-------------------+
                     ^                           ^
                     |                           |
        +-----------+-----------+     +---------+---------+
        | RefinedAbstraction    |     | ConcreteImplementor|
        +-----------------------+     +---------------------+

代码示例

class Renderer(ABC):  # Implementor
    @abstractmethod
    def render_circle(self, radius):
        pass

class VectorRenderer(Renderer):
    def render_circle(self, radius):
        print(f"Drawing circle with radius {radius}")

class Shape:  # Abstraction
    def __init__(self, renderer):
        self.renderer = renderer
    
    def draw(self): pass

组合模式(Composite)

意图:将对象组合成树形结构以表示”部分-整体”层次

关键角色

透明式 vs 安全式

类型 优点 缺点
透明式 客户端无需区分节点类型 叶子节点需实现空方法
安全式 避免无效操作 客户端需类型检查

装饰器模式(Decorator)

意图:动态地给对象添加额外职责

典型应用

InputStream in = new BufferedInputStream(
                 new FileInputStream("test.txt"));

与继承对比

维度 装饰器模式 继承
扩展方式 运行时动态添加 编译时静态绑定
灵活性 支持任意组合 固定层级关系

外观模式(Facade)

意图:为复杂子系统提供统一入口

设计要点

  1. 了解子系统所有功能
  2. 设计合理的简化接口
  3. 避免成为”上帝对象”

效果评估

✅ 降低客户端的复杂度
❌ 可能违反开闭原则


享元模式(Flyweight)

意图:运用共享技术有效支持大量细粒度对象

实现步骤

  1. 分离内在状态(共享)和外在状态(非共享)
  2. 创建享元工厂管理对象池
  3. 客户端维护外在状态

使用场景


代理模式(Proxy)

意图:为其他对象提供一种代理以控制对这个对象的访问

常见代理类型

类型 功能特点
远程代理 控制远程对象访问
虚拟代理 延迟初始化大对象
保护代理 增加权限控制
智能引用代理 添加引用计数等附加操作

模式对比与选型指南

模式 适用场景 复杂度
适配器 接口转换 ★★☆
桥接 多维度扩展 ★★★
装饰器 动态功能扩展 ★★☆
代理 访问控制 ★★☆

选型原则: 1. 明确需要解决的问题类型 2. 评估系统未来扩展方向 3. 考虑团队熟悉程度


实际应用案例分析

案例1:电商平台支付系统

classDiagram
    class PaymentGateway {
        +processPayment()
    }
    
    class AlipayAdapter {
        -alipay: AlipayService
        +processPayment()
    }
    
    PaymentGateway <|-- AlipayAdapter

案例2:跨平台UI框架设计

使用桥接模式分离平台相关代码与业务逻辑,使Android/iOS实现可独立演进。


总结

结构型模式通过不同的组合方式解决系统结构问题: 1. 适配器解决兼容问题 2. 桥接分离抽象与实现 3. 组合处理树形结构 4. 装饰器动态添加功能 5. 代理控制对象访问

合理运用这些模式可显著提升系统可维护性和扩展性。建议从简单模式开始实践,逐步掌握复杂模式的组合使用技巧。 “`

(注:此为精简版框架,完整10550字版本需扩展每个模式的:
1. 详细代码示例
2. 性能影响分析
3. 多语言实现对比
4. 反模式警示
5. 单元测试方案
6. 相关设计原则解析等内容)

推荐阅读:
  1. JDK 源码 阅读 - 3 - 设计模式 - 结构型模式
  2. php设计模式(二):结构型模式

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:如何使用VBS合并一个文件夹里的TXT

下一篇:如何用Mxnet和Tensorflow做简单多分类器的对比测试

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》