0
点赞
收藏
分享

微信扫一扫

巧妙的运用适配器模式,让你的工作量至少减轻一半

求索大伟 2022-02-14 阅读 16


今天我们就一起来聊聊使用超广的适配器模式!

一、介绍

适配器模式,顾名思义,就是将一个类的接口转换成客户希望的另一个接口,使接口不兼容的类可以一起工作,也被称为包装器模式(Wrapper)。

在适配器模式中,通常通过增加一个新的适配器类来解决接口不兼容的问题,使得原本没有任何关系的类可以协同工作。

从设计的角度看,适配器模式涉及到三个角色:


  • 适配器类:适配器类可以调用另一个接口,从而实现接口的转换;
  • 被适配类:被适配类定义了一个已经存在的接口,这个接口需要适配;
  • 客户角色:客户类提出使用具体类的请求;

二、示例

在 java 中,适配器模式有两种,类适配器和对象适配器,下面我们一起来看看!

2.1、类适配模式

首先,我们创建一个接口​​Phone​​​,接口的实现类为​​HuaweiPhone​​!

public interface Phone {

void productPhone();
}
public class HuaweiPhone implements Phone {

@Override
public void productPhone() {
System.out.println("生产一部华为手机");
}
}

在创建另一个接口​​Player​​​,如果​​Player​​​的实现类想调用​​HuaweiPhone​​​中的​​productPhone​​方法,该怎么办呢?

最简单的方法,就是将​​productPhone​​的方式逻辑抄一遍,但是这种方法显然不高效!

可以通过创建一个适配器​​ExpensiveAdapter​​​,使之继承​​HuaweiPhone​​,来解决接口转换的问题,如下:

public class ExpensiveAdapter extends HuaweiPhone implements Player {

@Override
public void action() {
//调用HuaweiPhone中的productPhone方法
productPhone();
System.out.println("用手机播放音乐");
}
}

测试类如下:

public class AdapterClient {

public static void main(String[] args) {
ExpensiveAdapter adapter = new ExpensiveAdapter();
adapter.action();
}
}

即可实现接口的转换!

但是这种方法,也有很大的局限性,假如​​Phone​​接口的实现类有多个呢?

我们知道,类是无法多继承的,对象适配模式就派上用场了!

2.2、对象适配模式

同样的,我们可以对​​ExpensiveAdapter​​类进行一定的优化,如下:

public class ExpensiveAdapter implements Player {

private Phone phone;

public ExpensiveAdapter(Phone phone) {
this.phone = phone;
}

@Override
public void action() {
//调用Phone接口中的productPhone方法
phone.productPhone();
System.out.println("用手机播放音乐");
}
}

测试客户端如下:

public class PlayerClient {

public static void main(String[] args) {
//对象适配
ExpensiveAdapter adapter = new ExpensiveAdapter(new HuaweiPhone());
adapter.action();
}
}

相比类适配模式,有木有发现对象适配模式更加灵活~

三、应用

在 jdk 中,适配器设计模式应用也非常广泛,例如我们熟悉的​​io​​包,其中字节流转字符流,就使用到了适配器模式!

巧妙的运用适配器模式,让你的工作量至少减轻一半_iphone巧妙的运用适配器模式,让你的工作量至少减轻一半_iphone_02

其中,最广泛的莫过于​​Spring​​​中的​​ioc​​对象依赖关系,在类A中,通过引入另一个类B 对象,就可以调用类 B 中的方法了,从而实现方法的协同工作!

四、总结

适配器模式,可以让任何两个没有关联的类一起运行,提高了类的复用;例如,现在非常流行的​​Mybatis-plus​​​持久框架,里面的​​Service​​​层就是典型的类适配模式,在​​Service​​​层可以很方便的进行​​crud​​​调用,开发人员基本不需编写​​crud​​的代码,开发效率大大提升!

但是,设计时如果过多的使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是另一个接口,反而另一个接口又回调了自身,一个系统如果太多出现这种情况,无异于一场灾难。

因此在设计使用的时候,尽可能层次分明,接口名包括方法名,取名的时候应该规范化定义!

五、参考

1、菜鸟教程 - 适配器模式

2、简书 - 键盘上的麒麟臂 - 浅谈Java适配器模式


< END >

告诉大家一个好消息,Java极客技术读者交流群(摸鱼为主),时隔 2 年后再次开放了,感兴趣的朋友,可以在公号回复:999

巧妙的运用适配器模式,让你的工作量至少减轻一半_适配器模式_03


巧妙的运用适配器模式,让你的工作量至少减轻一半_适配器模式_04



举报

相关推荐

0 条评论