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

开发 前端
适配器模式,可以让任何两个没有关联的类一起运行,提高了类的复用;但是,过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是另一个接口,反而另一个接口又回调了自身,一个系统如果太多出现这种情况,无异于一场灾难。

大家好,我是了不起,今天我们就一起来聊聊使用超广的适配器模式!

一、摘要

适配器设计模式是一种结构型模式

适配器模式,顾名思义,就是将一个类的接口转换成客户希望的另一个接口,使接口不兼容的类可以一起工作,也被称为包装器模式(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包,其中字节流转字符流,就使用到了适配器模式!

图片图片

图片图片

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

四、总结

适配器模式,可以让任何两个没有关联的类一起运行,提高了类的复用;但是,过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是另一个接口,反而另一个接口又回调了自身,一个系统如果太多出现这种情况,无异于一场灾难。

同时,由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,在设计的时候尽可能的选择对象适配模式!

五、参考

1、https://www.runoob.com/design-pattern/adapter-pattern.html

2、https://www.jianshu.com/p/b3a00cca10de

责任编辑:武晓燕 来源: Java极客技术
相关推荐

2021-07-26 07:32:48

模式适配器包装器

2009-03-09 12:53:09

服务器虚拟化IDC虚拟机

2022-02-18 17:21:29

适配器模式客户端

2020-10-25 08:56:21

适配器模式

2022-02-13 23:33:24

设计模式Java

2023-09-06 13:20:00

适配器模式兼容性

2012-05-16 17:22:11

Java设计模式

2012-08-02 10:46:34

JavaAdapter模式

2024-02-22 12:13:49

适配器模式代码

2021-02-18 08:39:28

设计模式场景

2013-11-26 16:39:21

Android设计模式

2022-05-29 22:55:00

适配器设计模式

2021-02-16 08:16:09

适配器模式MybatisJava

2009-11-18 18:08:20

PHP适配器模式

2021-07-12 07:08:54

责任链模式对象

2024-07-31 10:41:16

C#设计模式

2012-09-19 15:29:26

Worklight适配器

2022-12-12 09:20:59

适配器模式接口

2013-02-26 10:55:47

C#适配器设计模式

2024-04-10 12:27:43

Python设计模式开发
点赞
收藏

51CTO技术栈公众号