设计模式——适配器模式

概述

适配器模式,顾名思义,就是把原本不兼容的接口,通过适配,使之兼容。
举个生活中简单的例子,以前的手机内存卡可以取出来,但是想和电脑之间传输音乐、视频等资料不能直接传输,需要通过USB读卡器,然后插入USB接口就可以传输了,这个USB读卡器就相当于适配器。
你经常使用的手机或电脑充电器,也属于适配器,它将220V的交流电转换为手机可用的直流电。下面,以手机充电器为例讲解适配器模式。

模式中的角色

1.目标接口(Target):客户所期待的接口,目标可以是具体的或抽象的类,也可以是接口。
2.需要适配的类(Adaptee):需要适配的类或适配者类
3.适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。

实现方式

类的适配器模式(采用继承实现)

类适配器是通过继承源类,实现目标接口的方式实现适配的。但是,由于Java单继承的机制,这就要求目标必须是接口,有一定的局限性。

public class AC220V {
    public int output220v() {
        int output220v = 220;
        return output220v;
    }
}

public interface DC5V {
    int dc5v();
}

public class Adapter extends AC220V implements DC5V{
    @Override
    public int dc5v() {
        int output220v = output220v();
        return (output220v / 44);
    }
}

/**
 * @Description: 基于类的适配器模式
 */
public class Test {
    public static void main(String[] args) {
        DC5V dc5V = new Adapter();
        int dc5 = dc5V.dc5v();
        System.out.println("转换后的电压为:" + dc5 + " 伏...");
    }
}

对象适配器模式(采用对象组合方式实现)

对象适配器,不是继承源类,而是依据关联关系,持有源类的对象,这也隐藏了源类的方法。在这里,适配器和源类的关系不是继承关系,而是组合关系。

public class AC220V {
    public int output220v() {
        int output220v = 220;
        return output220v;
    }
}

public interface DC5V {
    int dc5v();
}

public class Adapter implements DC5V{

    private AC220V ac220V;

    public Adapter(AC220V ac220V) {
        this.ac220V = ac220V;
    }

    @Override
    public int dc5v() {
        int output220v = ac220V.output220v();
        return (output220v / 44);
    }
}

/**
 * @Description: 基于对象的适配器模式
 */
public class Test {
    public static void main(String[] args) {
        DC5V dc5V = new Adapter(new AC220V());
        int dc5 = dc5V.dc5v();
        System.out.println("输入的电压为:" + new AC220V().output220v() + " 伏...");
        System.out.println("转换后的电压为:" + dc5 + " 伏...");
    }
}

接口适配器模式(缺省适配器模式)

设想,我现在的目标接口有多个方法,可以输出5V,12V,20V的电压。按照正常逻辑,设计一个适配器去实现这个接口,很显然需要实现所有的方法。但是,实际使用中,其实只需要使用其中一个方法就可以了,比如我mac电脑直流电压20V,只需要实现20V的方法就可以了。
因此,设计一个中间类去把目标接口的所有方法空实现,然后适配器类再去继承这个中间类,选择性重写我所需要的方法。

public class AC {
    public int outputAC(){
        return 220;
    }
}

public interface DCOutput {
    public int output5V();

    public int output12V();

    public int output20V();
}

public abstract class DefaultAdapter implements DCOutput{

    @Override
    public int output5V() {
        return 0;
    }

    @Override
    public int output12V() {
        return 0;
    }

    @Override
    public int output20V() {
        return 0;
    }
}

public class MacAdatper extends DefaultAdapter {

    private AC ac;

    public MacAdatper(AC ac) {
        this.ac = ac;
    }

    @Override
    public int output20V() {
        return ac.outputAC() / 11;
    }

    public static void main(String[] args) {
        MacAdatper adatper = new MacAdatper(new AC());
        System.out.println("mac电脑电压:" + adatper.output20V());
    }
}

总结

类适配器模式,继承源类,实现目标接口。
对象适配器模式,持有源类的对象,把继承关系改变为组合关系。
接口适配器模式,借助中间抽象类空实现目标接口所有方法,适配器选择性重写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值