适配器模式 - Adapter Pattern,又叫做变压器模式,也叫做包装模式(Wrapper)。

WHAT

定义

Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn't otherwise because of incompatible interface.

将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类都能够在一起工作。

类图

Target目标角色

定义爸其他类转换为何种接口,也就是我们所期望的接口

public interface Target {
  // 目标角色有自己的方法
}

目标角色是一个已经在正式运行的角色,不可能去修改角色中的方法,能做的是如何去实现接口中的方法。

通常情况下,目标角色是一个接口或者抽象类,不会是实现类。

// 目标对象实现类
public class ConcreteTarget implements Target {
  public void requset(){
    System.out.pringln("if you need any help, pls call me!");
  }
}

Adaptee源角色

想把X转换成目标角色,X就是源角色,是已经存在的、运行良好的类或对象。

public class Adaptee {
  // 原有的业务逻辑
  public void doSomething(){
    System.out.println("I'm kind of busy, leave me alone, pls!");
  }
}

Adapter适配器角色

适配器模式的核心角色,需要新建立,职责非常简单:把源角色转换为目标角色。

通过集成或者类关联的方式。

public class Adapter extends adaptee implements Target{
  public void request(){
    super.doSomething();
  }
}

场景类

public class Client{
  public static void main(String[] args){
    // 原有的业务逻辑
    Target target = new Concretements();
		target.request():
    //现在增加了适配器角色后的业务逻辑
    Target target2 = new Adapter();
    target2.request();
  }
}
    • 访问的Target目标角色,具体的实现都委托给了源角色,对于高层次模块是透明的,但也不需要关心
  • 提高了类的复用度
    • 源角色在原有的系统逻辑中继续使用,同时在目标角色处提供了能力支持
  • 灵活性非常好
    • 如果不需要了,直接删除配置器就可以了。

HOW

使用场景

当有动机修改一个已经投产中的接口时,适配器模式可能是最适合的模式。

注意事项

  • 在详细设计阶段不要考虑它,不是为了解决还处在开发阶段的问题,而是正在服役的问题项目。
  • 这个模式使用的主要场景是扩展应用中
  • 项目一定要遵守依赖倒置原则和里氏替换原则,否则在使用合适的适配器的场合下,也会带有非常大的改造。

最佳实践

适配器模式是一个补偿模式,通常用来解决接口不相容的问题。


《设计模式之禅》 第19章 适配器模式