设计模式-适配器模式

发布时间 2023-11-09 15:32:41作者: hasome

参考:https://blog.csdn.net/yourgod007/article/details/131217788

概述

  • 适配器模式是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另一个接口。适配器模式的主要目的是解决两个不兼容接口之间的接口转换问题,使得原本由于接口不匹配而无法工作的类可以协同工作。
  • 在现实生活中,适配器也是常见的一种工具,例如电源适配器可以将不同国家的电源插头转换成我们所需要的标准插头。同样,适配器模式在软件开发中起到了类似的作用。
  • 适配器模式的核心思想是创建一个适配器类,该适配器类实现了客户端期望的目标接口,并持有一个对被适配者对象的引用。适配器类通过调用被适配者对象的方法来实现目标接口的方法,从而完成接口的适配。

结构

  • 包括目标接口(Target)、适配器(Adapter)、被适配者(Adaptee)等组成部分

优缺点

优点

  • 提供了接口转换功能:适配器模式可以将一个接口转换成另一个接口,使得原本不兼容的类可以一起工作。它解决了接口不兼容的问题,提供了接口之间的桥梁,使得不同的类可以进行协同工作。
  • 增加了代码的复用性:适配器模式可以重复使用现有的类,不需要修改已有类的代码。通过创建适配器类,可以在不影响已有类的情况下,将新的功能适配到已有类的接口上,增加了代码的复用性。
  • 提高了系统的灵活性和可扩展性:适配器模式将不同接口的差异性隐藏起来,提供统一的接口给客户端使用。这使得系统更加灵活,能够适应不同的变化和需求,并且可以方便地进行功能扩展。
  • 实现了解耦:适配器模式降低了类与接口之间的耦合性。适配器类作为中间层,将客户端与被适配对象解耦,客户端只需要通过适配器类来访问被适配对象,不需要知道具体的实现细节。

缺点

  • 增加了系统复杂性:引入适配器模式会增加代码的复杂性,需要额外创建适配器类,并编写适配逻辑。这可能会导致系统变得复杂,增加了代码的维护成本。
  • 可能影响系统性能:适配器模式在接口转换过程中可能会引入一定的开销,可能会影响系统的性能。特别是在处理大量数据或高并发场景下,需要谨慎考虑适配器模式的使用。

应用场景

  • 不兼容的接口:当两个或多个接口之间存在不兼容的情况时,可以使用适配器模式来实现它们之间的协同工作。适配器模式可以将一个接口转换成另一个接口,使得原本不兼容的类可以一起工作。
  • 已有类的功能扩展:当已有类的功能需要进行扩展或修改时,可以使用适配器模式。通过创建一个适配器类,将新的功能适配到已有类的接口上,从而实现功能的扩展而不影响已有类的代码。
  • 封装第三方库或组件:当需要使用一个第三方库或组件,但其接口与当前系统的接口不匹配时,可以使用适配器模式来封装第三方库或组件。适配器模式将第三方库的接口转换成系统需要的接口,使得系统可以无缝地集成和使用第三方库。
  • 兼容新旧版本:当系统需要兼容新旧版本的代码时,可以使用适配器模式。适配器模式可以将新版本的接口适配成旧版本的接口,使得旧版本的代码可以与新版本的代码无缝协作。

总之,适配器模式适用于解决接口不兼容、功能扩展、封装第三方库等场景。它能够将不同接口之间的差异性隐藏起来,提供统一的接口给客户端使用,从而增强系统的灵活性、可扩展性和可维护性。

类适配器

被适配的类adaptee

/**
 * 被适配的类
 */
public class Voltage220v {
    public int output220v() {
        int src = 220;
        System.out.println("电压=" + src + "伏");
        return src;
    }
}

目标类

public interface Voltage5v {
    public int output5v();
}

适配类

/**
 * 适配类
 * extends:单继承src,局限性
 * VoltageAdapter类:暴露了Voltage220v(src)类output220v()方法,但是灵活性增强了
 */
public class VoltageAdapter extends Voltage220v implements Voltage5v{

    @Override
    public int output5v() {
        int src = output220v();
        int dst = src / 44;
        return dst;
    }
}

测试

public class Phone {

    public void charging(Voltage5v voltage5v) {
        if(voltage5v.output5v() == 5) {
            System.out.println("电压为5V,可以充电~~");
        } else {
            System.out.println("电压异常,不可以充电~~");
        }
    }
}
public class Client {
    public static void main(String[] args) {
        System.out.println("类适配器模式~~");
        Phone phone = new Phone();
        phone.charging(new VoltageAdapter());
    }
}

对象适配器

适配类

/**
 * 适配类
 * VoltageAdapter类:构造注入,聚合方式
 */
public class VoltageAdapter implements Voltage5v {

    /**
     * 通过构造,把Voltage220v注入进来(聚合方式-合成复用原则)
     */
    private Voltage220v voltage220v;

    public VoltageAdapter(Voltage220v voltage220v) {
        this.voltage220v = voltage220v;
    }

    @Override
    public int output5v() {
        int src = voltage220v.output220v();
        int dst = src / 44;
        return dst;
    }
}

测试

public class Client {
    public static void main(String[] args) {
        System.out.println("对象适配器模式~~");
        Phone phone = new Phone();
        phone.charging(new VoltageAdapter(new Voltage220v()));
    }
}

接口适配器

接口

public interface Interface4 {
    public void m1();
    public void m2();
    public void m3();
    public void m4();
}

抽象类实现接口

public abstract class AbsAdapter implements Interface4{

    // ctrl + o 重写方法快捷键键
    // 空实现
    @Override
    public void m1() {

    }

    @Override
    public void m2() {

    }

    @Override
    public void m3() {

    }

    @Override
    public void m4() {

    }
}

测试

public class Client {
    public static void main(String[] args) {
        AbsAdapter adapter = new AbsAdapter() {
            // 在这里只需要覆盖我们所需要的接口方法
            @Override
            public void m1() {
                System.out.println("接口适配器模式实现");
            }
        };
        adapter.m1();
    }
}