结构型模式(1)——适配器模式

结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。
由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。


结构型模式分为以下 7 种:

  1. 代理(Proxy)模式:为某对象提供一种代理以控制对该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性。
  2. 适配器(Adapter)模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
  3. 桥接(Bridge)模式:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现的,从而降低了抽象和实现这两个可变维度的耦合度。
  4. 装饰(Decorator)模式:动态地给对象增加一些职责,即增加其额外的功能。
  5. 外观(Facade)模式:为多个复杂的子系统提供一个一致的接口,使这些子系统更加容易被访问。
  6. 享元(Flyweight)模式:运用共享技术来有效地支持大量细粒度对象的复用。
  7. 组合(Composite)模式:将对象组合成树状层次结构,使用户对单个对象和组合对象具有一致的访问性。

以上 7 种结构型模式,除了适配器模式分为类结构型模式和对象结构型模式两种,其他的全部属于对象结构型模式。

结构型模式(1)——适配器模式

(图片来源:https://www.jianshu.com/p/8a293e4a888e


定义

将一个与当前类无法兼容的接口转换成能够兼容当前类的接口。

现在有一个第三方类/我们项目组中别人写的类放在我们面前,我们需要调用其中的功能,但是第三方类提供给我们的接口和我们程序的接口不相匹配,这时我们就需要再写一个适配器类,把第三方类不匹配的接口转换成能被我们程序调用的接口。

优点:

  • 客户端通过适配器可以透明地调用目标接口。
  • 复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类。
  • 将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。

缺点:对类适配器来说,更换适配器的实现过程比较复杂。

模式结构:

  1. 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
  2. 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
  3. 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。

类适配器模式结构图:

结构型模式(1)——适配器模式

对象适配器模式结构图:

结构型模式(1)——适配器模式

1.用户Client想调用Adaptee类中的一些功能,但发现接口与自己定义的接口不一致;

2.此时Client按照自己原本的要求将所需要的功能都写入接口Target中;

3.然后适配器类Adapter实现这个接口;

4.Adapter类继承Adaptee类;

5.Adapter类在实现request函数时,通过成员变量Adaptee来调用Adaptee中specificRequest函数,从而实现了将Adaptee中的功能向Target所需的接口名字转化的过程。

6.Client只需要:

Target target = new Adapter();

target.request();

此时Client仍然调用自己规定的接口request(),但执行的已经是Adaptee中的specificRequest()的功能了。

何时使用适配器模式?

1.在软件开发后期或是开发结束之后,被调用的一些接口需要换掉,为了不需改已经开发好的代码,可以增加一个适配器,起到连接新接口和旧调用的桥梁。

PS:一般在软件设计、开发过程中,如果发现需要调用的接口和原本定义的接口不匹配,应尽量选择重构接口,而不是使用适配器作为转换。

2.在软件开发过程中,需要调用第三方类库的时候,如果第三方类库提供的接口和我们设计的接口不一致,此时可以使用适配器模式,将第三方类库的接口转换成我们所需要的接口。

总之一句话:在接口的调用和被调用双方都不太容易修改的时候再使用适配器模式。

 

参考:

(1)三句话搞定适配器模式  https://blog.****.net/u010425776/article/details/48007027

(2)适配器模式(Adapter模式)详解  http://c.biancheng.net/view/1361.html