栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

设计模式之适配器模式详解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

设计模式之适配器模式详解

设计模式之适配器模式详解

文章目录
  • 设计模式之适配器模式详解
  • 一、什么是适配器模式
  • 二、适配器模式的角色组成
  • 三、适配器模式应用场景
  • 四、适配器模式--类适配器示例
  • 五、适配器模式--对象适配器示例
  • 六、适配器模式--接口适配器示例
  • 七、适配器模式优缺点

一、什么是适配器模式

适配器模式(Adapter Pattern) 也称为变压器模式 ,它的功能是将一个类的接口变成客户端所期望的另一种接口,从而使原本因接口不匹配而导致无法在一起工作的两个类能够一起工作,属于结构型设计模式。适配器模式其实起着转化、委托的作用,将一种接口转化为另一种符合需求的接口。例如,当前系统存在两种接口A、B,客户只支持访问A接口,但是当前系统没有A接口对象,但是有B接口对象,但是客户又无法识别B接口,因此需要通过一个适配器C,将B接口内容转换成A接口,从而使得客户能够从A接口获取得到B接口内容。

二、适配器模式的角色组成
  • 目标角色(Target): 我们所期望的接口;
  • 源角色(Adaptee): 存在于系统中,内容满足客户需求(需转换),但接口不匹配的接口实例;
  • 适配器(Adapter): 将源角色(Adaptee)转化为目标角色(Target)的类实例;
三、适配器模式应用场景

提供一个转换器(适配器),将当前系统存在的一个对象转化为客户端能够访问的接口对象。

  • 已经存在的类,它的方法和需求不匹配(方法结果相同或者相似)的情况
  • 适配器模式不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品、不同厂家造成功能类似而接口不相同情况下的解决方案
四、适配器模式–类适配器示例

类适配器的原理就是通过继承来实现适配器功能。具体做法:让Apapter实现Target接口,并且继承Apaptee,这样Apapter就具备Target和Apaptee的特性,就可以将两者进行转化。类图如下:

下面通过以下功能做一个示例,我们假设系统只有一个能提供AC220V交流电的类,而我们手机充电需要5V的电压,这时我们通过一个电源适配器来进行转换,先创建Adaptee(源角色)220V交流电的类:

public class Adaptee{

    public int specificRequest() {
        return 220;
    }

}

目标角色Target,针对当前例子就是定义一个直流5V电标准:

public interface Target {

    int request();

}

创建电源适配器 Adapter 将电压进行转换:

public class Adapter extends Adaptee implements Target {

    public int request() {
        int adapterInput = super.specificRequest();
        int adapterOutput =  adapterInput / 44 ;
        System.out.println("使用Adapter输入AC" + adapterInput + "V, 输出DC " + adapterOutput + "V");
        return adapterOutput;
    }

}

编写测试类:

public class Test {
    public static void main(String[] args) {
        Target adapter = new Adapter();
        adapter.request();
    }
}

代码测试,控制台输出:

五、适配器模式–对象适配器示例

对象适配器的原理就是通过组合来实现适配器功能。具体做法:让Adapter实现Target接口,然后内部持有Adaptee实例,然后再Target接口规定的方法内转换Adaptee

public class Adaptee{

    public int specificRequest() {
        return 220;
    }

}

目标角色Target,针对当前例子就是定义一个直流5V电标准:

public interface Target {

    int request();

}

创建电源适配器 Adapter 将电压进行转换:

public class Adapter implements Target {

    private Adaptee adaptee;

    public Adapter(Adaptee adaptee){
        this.adaptee = adaptee;
    }

    public int request() {
        int adapterInput = adaptee.specificRequest();
        int adapterOutput =  adapterInput / 44 ;
        System.out.println("使用Adapter输入AC" + adapterInput + "V, 输出DC " + adapterOutput + "V");
        return adapterOutput;
    }

}

编写测试类:

public class Test {
    public static void main(String[] args) {
        Target adapter = new Adapter();
        adapter.request();
    }
}

代码测试,控制台输出:

六、适配器模式–接口适配器示例

接口适配器的关注点与类适配器和对象适配器的关注点不太一样,类适配器和对象适配器着重于将系统存在的一个角色(Adaptee)转化成目标接口(Target)所需内容,而接口适配器的使用场景是解决接口方法过多,如果直接实现接口,那么类将会多出许多空实现的方法,类显得很臃肿。此时,使用接口适配器就能让我们只实现我们需要的接口方法,目标更加清晰。接口适配器的主要原理就是利用抽象类实现接口,并且空实现接口众多方法:

public class Adaptee{

    public int specificRequest() {
        return 220;
    }

}

目标角色Target,针对当前例子就是定义直流电标准:

public interface Target {

    int request5V();
    int request12V();
    int request24V();
    int request48V();
    
}

创建电源适配器 Adapter 将电压进行转换:

public abstract class Adapter implements Target {

    protected Adaptee adaptee;

    public Adapter(Adaptee adaptee){
        this.adaptee = adaptee;
    }

    public int request5V() {
        return 0;
    }

    public int request12V() {
        return 0;
    }

    public int request24V() {
        return 0;
    }

    public int request48V() {
        return 0;
    }
}

编写测试类:

public class Test {
    public static void main(String[] args) {
        Target adapter = new Adapter(new Adaptee()) {
            @Override
            public int request5V() {
                int adapterInput = adaptee.specificRequest();
                int adapterOutput =  adapterInput / 44 ;
                System.out.println("使用Adapter输入AC" + adapterInput + "V, 输出DC " + adapterOutput + "V");
                return adapterOutput;
            }
        };
        adapter.request5V();
    }
}

代码测试,控制台输出:

七、适配器模式优缺点
  • 优点
    • 能够提高类的透明性和复用,现有的类复用但不需要改变
    • 目标类和适配器解耦,提高程序的扩展性
    • 在很多业务场景中符合开闭原则
  • 缺点
    • 适配器编写过程需要全面考虑,可能会增加系统的复杂性
    • 增加代码阅读难度。降低代码可读性,过多使用适配器会使系统变得凌乱
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/584341.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号