【设计模式 - 5】之适配器模式(Adapter)


1      模式简介

适配器模式解决的问题:让原本因为接口不兼容而不能一起工作的类可以一起工作。

 

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


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

 

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

1)        目标接口Target:用户期望使用的接口,这个类可以是接口,也可以是抽象类或具体类;

2)        需要适配的类Adaptee:当前系统中有的类;

3)        适配器Adapter:在现有接口和目标接口之间的“调停者”,作用是将现有接口转换成目标接口。

 

适配器模式的优点:

1)        通过适配器模式,用户在做相似的操作时可以调用同一个接口,其内部过程对于用户是透明的,这样做更简单、更直接、更解耦;

2)        复用了现存的类,解决了现存类和复用环境要求不一致的问题;

3)        将目标接口和现有接口解耦,通过引入一个适配器类,而无需修改原有的代码。

 

适配器模式的缺点:

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

 

适配器模式的适用场景:

1)        当系统需要使用现有的类,而现有的类不符合系统的接口的时候;

2)        当期望的功能和系统中现有的某个类的功能相似,但是具有不同的接口的时候;

3)        当系统已经实现了某个功能,但用户想要通过另一种接口方式访问,而我们不想修改原有接口的时候;

4)        当使用的第三方组件的接口和系统中定义好的接口不同,但又不希望修改系统接口的时候。

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】


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值