设计模式-适配器模式

一、适配器模式介绍

适配器模式(Adapter Pattern):别名为包装器(Wrapper),是将某个类的接口转换成客户端期望的另一个接口表示。主要目的是兼容性,让原本因接口不能匹配不能一起工作的两个类可以协同工作。

适配器模式属于结构型模式

主要分为三类

  • 类适配器模式
  • 对象适配器模式
  • 接口适配器模式

工作原理: 用户调用适配器转化出来的目标接口方法,适配器再调用被适配者的相关接口方法。

接下来以生活中充电的例子说明该模式:诉求是将220V的交流电通过适配器输出目标为5V的电压,使得能够满足手机正常充电。

二、类适配器模式

2.1 示例关系:

2.2 代码实现:

/* *
 * 被适配者:220V电压。
 */

class Voltage220V {
    public int outPut220V() {
        return 220;
    }
}

/* *
 * 输出目标:5v电压。
 */

interface IVoltage5V {
    int outPut5V();
}


/* *
 * 适配器。
 */

class VoltageAdapter extends Voltage220V implements IVoltage5V {

    @Override
    public int outPut5V() {
        Voltage220V voltage220V = new Voltage220V();
        int srcV = voltage220V.outPut220V();
        int tarV = srcV / 44;
        System.out.println("使用适配器转换电压:转换前为" + srcV + "V," +
                "转换后为" + tarV + "V。");
        return tarV;
    }
}

class Phone {
    public void charging(IVoltage5V iVoltage5V) {
        int curV = iVoltage5V.outPut5V();
        System.out.println("手机充电中...当前电压为:" + curV + "V。");
    }
}

/* *
 * 使用[类适配器]模式进行转换。
 */

public class Client {
    public static void main(String[] args) {
        Phone phone = new Phone();
        phone.charging(new VoltageAdapter());
        // 使用适配器转换电压:转换前为220V,转换后为5V。
        // 手机充电中...当前电压为:5V。
    }
}

2.3 方式说明:

该模式会使用到继承,因此被适配的类方法会被暴露,增加了使用的成本。

同样因为采用继承,适配器可以重写被适配类的方法,它在一定程度上是具备灵活性的。

三、对象适配器

3.1 示例关系:

3.2代码实现:

/* *
 * 被适配者:220V电压。
 */

class Voltage220V {
    public int outPut220V() {
        return 220;
    }
}

/* *
 * 输出目标:5v电压。
 */

interface IVoltage5V {
    int outPut5V();
}


/* *
 * 适配器。
 */

class VoltageAdapter implements IVoltage5V {
    /* *
     * 使用组合的方式
     */

    private final Voltage220V voltage220V;

    public VoltageAdapter(Voltage220V voltage220V) {
        this.voltage220V = voltage220V;
    }

    @Override
    public int outPut5V() {
        int srcV = voltage220V.outPut220V();
        int tarV = srcV / 44;
        System.out.println("使用适配器转换电压:转换前为" + srcV + "V," +
                "转换后为" + tarV + "V。");
        return tarV;
    }
}

class Phone {
    public void charging(IVoltage5V iVoltage5V) {
        int curV = iVoltage5V.outPut5V();
        System.out.println("手机充电中...当前电压为:" + curV + "V。");
    }
}

/* *
 * 使用[对象适配器]模式进行转换。
 */

public class Client {
    public static void main(String[] args) {
        Phone phone = new Phone();
        phone.charging(new VoltageAdapter(new Voltage220V()));
        // 使用适配器转换电压:转换前为220V,转换后为5V。
        // 手机充电中...当前电压为:5V。
    }
}

3.3 方式说明:

基本思路同类适配器模式相同,只是根据“合成复用原则”,在适配器中使用到了关联关系来代替继承

四、接口适配器

4.1 示例关系:

4.2 代码实现:

/* *
 * 被适配者:220V电压。
 */

class Voltage220V {
    public int outPut220V() {
        return 220;
    }
}

/* *
 * 提供各种转化方法的电压接口。
 */

interface IVoltage {
    void conversionTo5V();

    void conversionTo18V();

    void conversionTo50V();
}

/* *
 * 抽象适配器-以缺省方式实现电压接口中的方法。
 */

abstract class AbsAdapter implements IVoltage {

    /* *
     * 使用组合的方式。
     */

    Voltage220V voltage220V;

    public AbsAdapter(Voltage220V voltage220V) {
        this.voltage220V = voltage220V;
    }

    @Override
    public void conversionTo5V() {

    }

    @Override
    public void conversionTo18V() {

    }

    @Override
    public void conversionTo50V() {

    }
}

class Phone {
    public void charging(int voltage) {
        System.out.println("手机充电中...当前电压为:" + voltage + "V。");
    }
}

/* *
 * 使用[接口适配器]模式进行转换。
 */

public class Client {

    public static void main(String[] args) {

        // 选择性地实现需要覆盖方法。
        new AbsAdapter(new Voltage220V()) {

            // 此处只用到了将电压转化为5V的方法。
            @Override
            public void conversionTo5V() {
                int srcV = voltage220V.outPut220V();
                int tarV = srcV / 44;
                System.out.println("使用适配器转换电压:转换前为" + srcV + "V," +
                        "转换后为" + tarV + "V。");

                Phone phone = new Phone();
                phone.charging(tarV);
            }
        }.conversionTo5V();
        // 使用适配器转换电压:转换前为220V,转换后为5V。
        // 手机充电中...当前电压为:5V。
    }

}

4.3 方式说明:

该模式也称作缺省适配器模式

核心思路:不需要全部实现接口提供的方法时,可以先设计一个抽象类实现接口,并为该接口每个方法提供一个默认实现(空方法),那么该抽象类的子类可以选择地覆盖父类的某些方法来实现需求。

适用于一个接口不想使用其所有的方法的情况。

五、总结

类适配器:将被适配类充当Adapter继承源(继承)。

对象适配器:将被适配类以对象的形式关联Adapter(持有)。

接口适配器:以接口形式给到Adapter,Adapter进行选择地实现(实现)。

六、结束语


“-------怕什么真理无穷,进一寸有一寸的欢喜。”

微信公众号搜索:饺子泡牛奶

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值