【设计模式】结构型——适配器模式

172 阅读3分钟

一、简介

结构型模式之一,将一个类的接口转换成客户希望的另一个接口。

它可以帮助我们在不改变原有代码的情况下,实现两个不兼容的接口之间的协同工作。

二、定义

适配器模式分为两种:类适配器模式、对象适配器模式,通常我们使用后者。

  1. 类适配器模式:对应适配器继承适配者,由于Java是单继承所以一般不使用类适配器模式会具有局限性。
    • 优点:由于适配器类是适配者类的子类,因此可以再适配器类中置换一些适配者的方法,使得适配器的灵活性更强。
    • 缺点:对于Java、C#等不支持多重继承的语言,一次最多只能适配一个适配者类,而且目标抽象类只能为接口,不能为类,其使用有一定的局限性,不能将一个适配者类和他的子类同时适配到目标接口。

image.png

  1. 对象适配器模式:在适配器的构造器中添加适配者的参数,在使用适配器时传入适配者,就能够做到灵活使用。
    • 优点:把多个不同的适配者适配到同一个目标,也就是说,同一个适配器可以把适配者类和他的子类都适配到目标接口。
    • 缺点:与类适配器模式相比,要想置换适配者类的方法就不容易。

image.png

(一)结构

  • 目标角色(Target):该角色定义把其他类转换为何种接口,也就是我们的期望接口。
  • 源角色(Adaptee):你想把谁转换成目标角色,这个“谁”就是源角色,它是已经存在的、运行良好的类或对象
  • 适配器角色(Adapter):适配器模式的核心角色,其他两个角色都是已经存在的角色,而适配器角色是需要新建立的,它的职责非常简单:通过继承或是类关联的方式把源角色转换为目标角色。

(二)类图

image.png

(三)示例代码

todo

三、适用场景

适配器模式适用于以下场景:

  • 需要将一个类的接口转换成客户端所期望的另一个接口。
  • 需要用一个已经存在的类,但是它的接口不符合客户端的需求。
  • 需要复用一些现存的类,他们处于同一个继承体系,并且他们又有了额外的一些共同的方法, 但是这些共同的方法不是所有在这一继承体系中的子类所具有的共性。

四、 spring源码中的适配器模式

SpringMvc中的HandlerAdapter, 就使用了适配器模式。

todo

五、总结

优点:

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

缺点:

  1. 代码整体复杂度增加, 因为你需要新增一系列接口和类。 有时直接更改服务类使其与其他代码兼容会更简单。

参考

  1. # 适配器模式(Adapter Pattern)
  2. 深入设计模式
  3. 设计模式之适配器模式(Java实现)