【设计模式

1、模式简介

适配器模式解决的问题:

  让原本因为接口不兼容而不能一起工作的类可以一起工作。

适配器模式的UML原理图如下图所示:

 

  从上图可见,客户想要用Target接口实现Adaptee接口中的方法,但这显然是不可能的。因此,我们需要定义一个适配器类Adapter,让它在Target和Adaptee之间做一个“调停者”,进而达到Target和Adaptee的适配。

适配器模式中有三种角色:

  • 目标接口Target:用户期望使用的接口,这个类可以是接口,也可以是抽象类或具体类;
  • 需要适配的类Adaptee:当前系统中有的类;
  • 适配器Adapter:在现有接口和目标接口之间的“调停者”,作用是将现有接口转换成目标接口。

适配器模式的优点:

  • 通过适配器模式,用户在做相似的操作时可以调用同一个接口,其内部过程对于用户是透明的,这样做更简单、更直接、更解耦;
  • 复用了现存的类,解决了现存类和复用环境要求不一致的问题;
  • 将目标接口和现有接口解耦,通过引入一个适配器类,而无需修改原有的代码。

适配器模式的缺点:

  使用适配器模式后,如果想要改变适配对象,就需要更换适配器,而更换适配器是一个非常复杂的过程。

适配器模式的适用场景:

  • 当系统需要使用现有的类,而现有的类不符合系统的接口的时候;
  • 当期望的功能和系统中现有的某个类的功能相似,但是具有不同的接口的时候;
  • 当系统已经实现了某个功能,但用户想要通过另一种接口方式访问,而我们不想修改原有接口的时候;
  • 当使用的第三方组件的接口和系统中定义好的接口不同,但又不希望修改系统接口的时候。

2、代码

  适配器模式有两种实现形式:类适配模式和对象适配模式。下面通过一个实例分别介绍这两种模式。

需求:

  我们现在的系统中有一个现有的类Adaptee,这个类中有一个adapteeMethod()方法。但是用户不想用Adaptee这个累,他们想用一个他们自己提供的接口Target,这个接口中有一个targetMethod()方法。虽然这两个类的功能相同,但是Target毕竟是一个接口,我们无法直接调用Adaptee类中的方法,而且我们也不想再把我们千辛万苦写好的Adaptee类中的代码重新写一遍。我们该怎么办?

  在解决上面的问题之前,我们先给出Adaptee和Target中的代码:

  Adaptee类中的代码:

public class Adaptee {
      public void adapteeMethod() {
           System.out.println("这是我们已经实现的功能!");
      }
}

  Target接口中的代码:

public interface Target {
      void targetMethod();
}

  接下来,我们分别用类适配模式和对象适配模式定义Adapter适配器类,来解决上面的问题。

2.1、类适配模式

  首先来看类适配模式的UML图:

 

  可以看到,类适配模式是将Adapter类直接继承Adaptee,这样就直接具有了Adaptee中的adapteeMethod()方法,然后直接在Adapter中实现的Target的targetMethod()方法中调用父类的方法即可达到适配效果。

  Adapter类中的代码如下:

public class Adapter extends Adaptee implements Target {
 
      @Override
      public void targetMethod() {
           super.adapteeMethod();
      }
}

  测试代码如下:

public class Test {
      public static void main(String[] args) {
           Targettarget = new Adapter();
           target.targetMethod();
      }
}

  运行结果如下图所示:

2.2、对象适配模式

  同理,先来看对象适配模式的UML图:

 

  可以看到,Adapter不再继承Adaptee,而是持有一个Adaptee类的引用,即将一个Adaptee的对象引用到Adapter类中,这就是对象适配模式的思路。同样,在Adapter的targetMethod()方法中调用Adaptee对象的adapteeMethod()方法即可完成适配。

  Adapter类中的代码如下:

public class Adapter implements Target {
      private Adaptee adaptee = new Adaptee();
 
      @Override
      public void targetMethod() {
           adaptee.adapteeMethod();
      }
}

  测试代码与类适配模式的测试代码完全相同。运行结果如下图所示:

以上就是对适配器模式AdapterPattern的介绍。

最后贴出适配器模式的GitHub代码:【GitHub - Adapter】

原文地址:https://www.cnblogs.com/itgungnir/p/6211100.html