Java设计模式-适配器模式

1. 适配器模式概述:

适配器模式是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另一个接口。适配器模式的主要目的是解决两个不兼容接口之间的接口转换问题,使得原本由于接口不匹配而无法工作的类可以协同工作。

在现实生活中,适配器也是常见的一种工具,例如电源适配器可以将不同国家的电源插头转换成我们所需要的标准插头。同样,适配器模式在软件开发中起到了类似的作用。

适配器模式的核心思想是创建一个适配器类,该适配器类实现了客户端期望的目标接口,并持有一个对被适配者对象的引用。适配器类通过调用被适配者对象的方法来实现目标接口的方法,从而完成接口的适配。

2. 适配器模式结构:

使用类图或示意图展示适配器模式的结构,包括目标接口(Target)、适配器(Adapter)、被适配者(Adaptee)等组成部分。

适配器模式常见的实现方式:

  1. 类适配器

类适配器使用继承来适配接口,它同时继承了目标接口和被适配者类,通过重写目标接口的方法并调用被适配者类的方法来实现适配。
在这里插入图片描述

  1. 对象适配器

对象适配器使用组合关系来适配接口,它持有一个被适配者对象的引用,在适配器类中调用被适配者对象的方法来实现适配。
在这里插入图片描述

  1. 接口适配器

是一种特殊的适配器模式,它用于解决接口过多或接口不匹配的问题。接口适配器模式通过定义一个抽象类来实现目标接口,并提供默认的空方法实现,这样客户端只需实现自己感兴趣的方法,而无需实现全部接口方法。
在这里插入图片描述

3. 适配器示例代码:

3.1 类适配器:

被适配类Adaptee:

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

目标类:

public interface Voltage5v {
    public int output5v();
}

适配类Adapter:

/**
 * 适配类
 * 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());
    }
}

3.2. 对象适配器:

与类对象适配器大致差不多,需要修改一下类:
适配类:

/**
 * 适配类
 * 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()));
    }
}

3.3. 接口适配器:

接口:

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();
    }
}

4. 适配器应用场景:

适配器模式在以下场景中特别有用:

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

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

5. 适配器优缺点分析:

适配器模式具有以下优点:

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

然而,适配器模式也存在一些缺点:

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

综上所述,适配器模式具有很多优点,可以帮助解决接口不兼容的问题,并增加代码的复用性和系统的灵活性。但同时也需要权衡其对系统复杂性和性能的影响,合理使用适配器模式,根据实际情况进行评估和取舍。

6. 总结:

总而言之,适配器模式是一种常用的设计模式,可以帮助解决接口不兼容的问题,并提供了一种灵活、可扩展的方式来进行接口适配和集成。合理使用适配器模式可以提高代码的可维护性和可复用性,使系统更加灵活和易于扩展。适配器模式在实际应用中非常广泛,特别是在集成第三方组件或处理遗留代码时。它可以帮助我们简化系统的接口调用,提高代码的可维护性和可测试性。

7. 参考资料:

  • 韩顺平-Java设计模式
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值