一天一个设计模式---适配器模式

来源:互联网 发布:淘宝我的收货地址在哪 编辑:程序博客网 时间:2024/06/05 00:19

介绍:适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

优点:
1. 如果不使用适配器,而是修改原有接口代码,这样会导致大量使用原有接口的方法需要被重写
2. 客户端可以调用同一接口,对客户端来感受不到变化
3. 将目标类和适配者类解耦

一、场景

小明去香港买了个iphone7 puls,拿回大陆的家中,发现港式插头为三孔插头电压为200v,家中插头都为二空的220v电压,用不了(如图)。这个时候,小明只能再去买个转换头了。
这里写图片描述

需求:香港提供的苹果插头为三孔200v,客户需求适配器的功能是将三孔转成二孔220v。
苹果的输出电流是10I。

分析:对于电压转换,可见对应电阻应该为20欧和22欧。对于插孔,前者有火线、零线、地线,而后者只需要火线和零线即可。

二、角色及作用

角色 作用 原接口 需要适配的接口 目标接口 客户所期待的接口 适配器 把原接口转换成目标接口

这里写图片描述

三、类适配器

原接口–三孔插头 输入电压200v

public class HongkongPlug {    int voltage = 200;    int rs = 20;    // 200v的输出方法    public void twoHundredV() {        System.out.println(voltage / rs);    }    // 三孔插头    public void threeHole() {        neutralWire();        liveWire();        groundWire();    }    public void neutralWire() {        System.out.println("火线");    };    public void liveWire() {        System.out.println("零线");    };    public void groundWire() {        System.out.println("地线");    };}

目标接口—二孔插头 输入电压220v

public interface MainlandPlug {    // 220v的输出方法    public void twoHundredTwentyV();    // 两孔插头    public void twoHole();}

类适配器—通过继承原接口

public class ClassAdapter extends HongkongPlug implements MainlandPlug {    @Override    public void twoHundredTwentyV() {        voltage = 220;        rs += 2;        twoHundredV();    }    @Override    public void twoHole() {        neutralWire();        liveWire();    }}

测试代码

    public static void main(String[] args) {        HongkongPlug hk=new HongkongPlug();        hk.threeHole();        hk.twoHundredV();        System.out.println("=========回到大陆");        ClassAdapter ad =new ClassAdapter();        ad.twoHole();        ad.twoHundredTwentyV();    }

输出如下

火线零线地线10=========回到大陆火线零线10

成功实现目标业务

四、对象适配器

区别:类适配器通过继承原接口的方式实现适配,而对象适配器通过持有原接口对象的方式实现适配。

public class ObjectAdapter implements MainlandPlug {    private HongkongPlug hkp;    public ObjectAdapter(HongkongPlug hkp) {        this.hkp = hkp;    }    @Override    public void twoHundredTwentyV() {        hkp.voltage = 220;        hkp.rs += 2;        hkp.twoHundredV();    }    @Override    public void twoHole() {        hkp.neutralWire();        hkp.liveWire();    }}

更多模式: 一天一个设计模式—分类与六大原则

更多源码: https://github.com/oDevilo/Java-Base

0 0
原创粉丝点击