雨来

千里之行,始于足下 thesky341@foxmail.com

0%

结构性模式

介绍

结构型模式用于解决“类或对象的组合“问题。组合优于继承,组合关系可以实现代码的解耦,提高代码的通用性。
几类结构型模式在编码上类似,但它们面向不同的业务场景,有不同的含义,同时会有细小的差别。比如代理模式和装饰器模式,都是在原有类上新套了一个类/逻辑,但代理模式常用于解耦非业务逻辑,如日志、缓存、限流等;装饰器模式常用于对原有功能对增强,比如Java的IO增强类,提供加密、缓存、特定类型编码等能力。
分为:代理模式,桥接模式,装饰器模式,适配器模式,门面模式,组合模式,享元模式

分类

代理模式

  1. 在不改变原始类的情况下,我们通过引入代理类给原始类附加功能。
  2. 实现时有两种方法,一种是实现原始类相同接口,或者继承原始类,达到对单一类添加功能的目的;另一种是动态代理,利用反射的能力,动态为一批类添加功能,可以实现面向切面编程的目的。
  3. 代理模式一般是为原始类添加非业务相关的功能,如监控、鉴权、日志、缓存、限流等

桥接模式

  1. GOF中将桥接模式模式定义为:将抽象和实现解耦,让它们可以独立变化。有一个更加简单的理解:如果对象有多个变化维度,可以通过组合的方式,让这个多个维度独立变化
  2. 我对桥接模式的理解,是组合由于继承。当一个对象有多个功能时,可以让多个对象来分别实现这些功能,然后组合起来,组成这个大的对象

装饰器模式

  1. 装饰器模式用于对原始类功能进行增强,通过对类进行增强会采用继承,但装饰器模式通过组合的方式进行增强。
  2. 装饰器模式允许对原始类进行多层嵌套,叠加多个增强功能
  3. 典型实现是Java中对IO类的增强

适配器模式

  1. 适配器模式是用来做适配的,它将不兼容的类转换为兼容的类,让无法一起使用的类转化为可以一起使用。
  2. 适配器模式有两种实现方式,一种是类适配器,通过继承来实现;另一种是对象适配器,通过组合实现
  3. 在结构模式中,有几种模式在实现时都很像,比如都推荐用组合来实现,我们需要区分它们的设计意图:
  • 代理模式:用于为原始类添加非业务功能,例如监控、日志、鉴权、限流、缓存
  • 桥接模式:单纯的实现方式,可以用于实现大的业务对象
  • 装饰器模式:对原始类原功能进行增强,例如对10添加专门对解析器、添加缓冲池
  • 适配器模式:是一种补偿模式,用来补救设计上的缺陷,比如接口入参不合适,新类常常会对方法出入参进行修改

门面模式

  1. 门面模式用于解决接口粒度的问题。对于一批已有的接口,可以组合成一个更大的接口,调用方可以只关注这个接口,不需要关注零碎的其它接口;如果一个接口粒度太大,也可以通过新建一个粒度更小的接口,调用方可以不关注接口其它方法。
  2. 在微服务场景,跨团队时经常使用门面模式,A可以自己新建一个接口,只包含B业务的部分接口;也可以新建一个接口,租户B、C几个业务相关的接口功能

组合模式

  1. 这里的组合模式,不是平时说的组合关系,而是一种特殊的数据结构。当业务数据满足树形结构时,可以组合成树形结构,便于递归使用。
  2. 场景特殊,使用不多。

享元模式

  1. 享元模式,就是指存在被共享的单元,目的是多个对象引用同一个单元,可以节省内存
  2. 需要注意,被共享的单元不能被修改,否则会影响全局
  3. 经典实现是Java中-128~127的Integer对象被共享
  4. 在和单例模式比较时,要注重设计意图。单例模式是为了保证全局唯一,享元模式是为了节省内存