设计模式 | 适配器模式

知识点七: 适配器模式


一、概述

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。它属于23种GOF设计模式的结构型设计模式  , 它结合了两个独立接口的功能。

这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。

适配器模式的别名为包装器(Wrapper)模式,它既可以作为类结构型模式,也可以作为对象结构型模式。在适配器模式定义中所提及的接口是指广义的接口,它可以表示一个方法或者方法的集合。


二、优缺点和使用场景

1、优点

  • 可以让任何两个没有关联的类一起运行。
  • 提高了类的复用。
  • 增加了类的透明度。
  • 灵活性好。

2、缺点

  • 过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
  • 由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。

3、使用场景

  • 有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。

三、模式中包含的角色和其职责

1、角色

目标抽象(Target)角色:目标抽象类定义客户所需的接口,可以是一个抽象类或接口,也可以是具体类。

适配器(Adapter)角色:它可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配。它是适配器模式的核心。

适配者(Adaptee)角色:适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类包好了客户希望的业务方法。


四、在Java中的实现

目标:我们平时用的电流都是220V的电,现在我的客户端(MainClass.java)只能用180V的电,使用适配器改变用电模式

平时用的电

Current.java

public class Current {
    public void use220V(){
        System.out.println("使用220V电流");
    }
}

1、通过继承实现

适配器模式_继承.png

适配器Adapter.java

/**
 * @Description: 适配器类
 * @Author: Ling.D.S
 * @Date: Created in 2018/11/12 19:52
 */
public class Adapter extends Current {
    public void use180V(){
        System.out.println("使用适配器");
        this.use220V();
    }
}

客户端MainClass.java

/**
 * @Description:
 * @Author: Ling.D.S
 * @Date: Created in 2018/11/12 19:49
 */
public class MainClass {
    public static void main(String[] args) {
        Adapter adapter = new Adapter();
        adapter.use180V();
    }
}

2、通过委任(组合)实现

适配器模式_委任.png

适配器Adapter.java

/**
 * @Description:
 * @Author: Ling.D.S
 * @Date: Created in 2018/11/12 20:05
 */
public class Adapter {
    private Current current;

    public Adapter(Current current) {
        this.current = current;
    }

    public void user180V(){
        System.out.println("使用适配器");
        this.current.use220V();
    }
}

客户端MainClass.java

/**
 * @Description:
 * @Author: Ling.D.S
 * @Date: Created in 2018/11/12 20:08
 */
public class MainClass {
    public static void main(String[] args) {
        Adapter adapter = new Adapter(new Current());
        adapter.user180V();
    }
}

转载请注明原地址,宋德凌的博客:http://CoderOfSong.github.io 谢谢!

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦