适配器模式

Scroll Down

概述

适配器模式的主要目的是解决由于接口不能兼容而导致类无法使用的问题,适配器模式会将需要适配的类转换成调用者能够使用的目标接口。

Adapter模式有以下两种。

  • 类适配器模式(使用继承的适配器)
  • 对象适配器模式(使用委托的适配器)

角色

  • 目标接口(Target):调用者能够直接使用的接口。
  • 需要适配的类(Adaptee):一般情况下,Adaptee类中有真正的业务逻辑,但是其接口不能被调用者直接使用。
  • 适配器(Adapter):Adapter实现了Target接口,并包装了一个Adaptee对象。Adapter在实现Target接口中的方法时,会将调用委托给Adaptee对象的相关方法,由Adaptee完成具体的业务。

下面来看适配器模式的类图。如下所示:
design-adaptee-001.drawio

说明

使用适配器模式的好处就是复用现有组件。应用程序需要复用现有的类,但第三方接口不能被该应用程序兼容,则无法直接使用。这种场景下就适合使用适配器模式实现接口的适配,从而完成组件的复用。很明显,适配器模式通过提供Adapter的方式完成接口适配,实现了程序复用Adaptee的需求,避免了修改Adaptee实现接口,这符合开放-封闭原则。当有新的Adaptee需要被复用时,只要添加新的Adapter即可,这也是符合开放-封闭原则的。

扩展思路的要点

什么时候使用Adapter模式

一定会有人认为如果某个方法就是我们所需要的方法,那么直接在程序中使用不就可以了吗?为什么还要考虑使用Adapter模式呢?那么,究竟应当在什么时候使用Adapter模式呢?
很多时候,我们并非从零编程,经常会用到现有的类。特别是当现有的类已经被充分测试过了,bug很少,而且已经被用于其他软件中,我们更愿意将这些类作为组件重复利用。
Adapter模式会对现有的类进行适配,生成新的类。通过该模式可以很方便地创建我们需要的方法群。当出现bug时,由于我们很明确地知道Bug不在现有的类(Adaptee角色中,所以只需调查扮演Adapter角色的类即可)这样一来,代码问题的排查就会变得非常简单。