# 结构型设计模式

# 适配器模式

Wrapper、Adapter 结构型设计模式,使接口不兼容的对象能相互合作

适配器实现了其中一个对象的接口,并对另一个对象进行封装。它是一种特殊的对象,通过转换对象接口或数据格式,使其能与其它对象交互

适应场景:

  • 希望使用某个类,但它的接口与其它代码不兼容

  • 复用一些类,它们处理同一继承体系,但又有一些额外的共同的方法,但这些方法不是这一体系中所有子类所具有的共性

    • 扩展每个子类,将缺失的功能添加到子类中
    • 缺失的功能放到一个适配器类中,目标类要求有通用的接口,适配器的成员亦是应当遵循通用的接口。这种方式与装饰模式有些相似
  • 通常在已有程序中使用,让相互不兼容的类能很好的工作

优点:

  • 符合单一职责原则,可将接口或数据转换代码从程序主要业务逻辑中分离
  • 开闭原则,只要客户端通过客户端接口与适配器进行交互,可在不修改现有客户端代码的情况下添加新的类型的适配器

缺点:

  • 代码整体复杂度增加,需要新增加一系列接口和类,有时直接更改服务类使其与其它代码兼容会更简单

区别:

  • 适配器为封装对象提供不同的接口

  • 代理模式为对象提供相同的接口

  • 装饰模式则为对象提供加强的接口

  • 外观模式为对象定义了一个新接口,并且外观通常作用于整个对象子系统上

  • 桥接、状态、策略基于组合,把工作委派给其它对象

# 应用

收银台对账系统三方账单处理

# 桥接模式

结构型设计模式,将业务逻辑或一个大类拆分成为不同的层次的结构,从而能独立的进行发展

形状类中添加颜色对象,所有与颜色相关的逻辑委派颜色对象处理

  1. 抽象部分:提供高层控制逻辑,依赖底层实际工作的实现对象完成功能
  2. 实现部分:为具体实现声明通用接口,抽象部分仅通过这里的声明的方法与实现对象交互

# 组合模式

结构型模式,将对象组合成树状结构,并像使用独立对象一样使用它们

无需要了解树状结构的对象的具体类,只需要调用能用接口以相同的方式对其进行处理,对象会将请求沿着🌲结构传递下去

# 装饰模式

装饰者模式,装饰器模式,Wrapper,Decorator

封装器,结构型设计模式,允许通过将对象放入特殊的封装对象中来为原对象增加新的行为。

目标对象和装饰器遵循同一接口

# 外观模式

门面模式,Facade

结构型模式,可为程序库,框架或包含许多活动部件的复杂子系统提供一个简单接口

外观模式为复杂子系统提供一个简单的接口,与直接调用子系统相比,外面提供的功能可能比较有限,但包含了客户端真正关心的功能

外观类为包含许多活动部件的复杂子系统提供一个简单的接口

# 应用

log4j日志库封装

# 享元模式

缓存、Cache、Flyweight

结构型模式,摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,在有限的内在中载入更多的对象

享元模式只是一种优化,仅在程序必须支持大量对象且没有足够的内存容量时使用享元模式

  1. 享元工厂 (Fly­weight Fac­to­ry) 会对已有享元的缓存池进行管理。 有了工厂后, 客户端就无需直接创建享元, 它们只需调用工厂并向其传递目标享元的一些内在状态即可。 工厂会根据参数在之前已创建的享元中进行查找, 如果找到满足条件的享元就将其返回; 如果没有找到就根据参数新建享元。

享元分拆为两个部分

  • 内在状态:不变的,可在许多对象中重复使用的数据的成员变量
  • 外在状态:包含每个对象各自不同的情景数据的成员变量

# 应用

游戏

# 代理模式

Proxy

结构型设计模式,能够提供对象替代器或占位符。代理控制着对原对象的访问,并允许将请求提交给对象前后进行一些处理

通常情况下代理会对其服务的对象的整个生命周期进行管理

场景:

  • 延迟初始化:重量级服务对象在真正需要时初始化
  • 访问控制:代理把满足要示诉凭据的客户端请求传递给服务
  • 本地执行远程服务调用:代理负责处理网络相关的复杂细节
  • 日志记录
  • 缓存请求结果
  • 智能引用
  • 服务生命周期管理
上次更新: : 19 days ago