Bootstrap

两种适配器模式

面向对象的23种设计模式点这里。说到适配器,我想我们接触最多的叫电源适配器。没错,所有的手机充电器都是电源适配器。从交流变直流,从220v到5v。而适配器模式分为两种,一种是类适配器,一种是对象适配器。下面先写类适配器:

public class Adapter {
    static class HomePower {
        public String homeRequest() {
            return "220V交流电";
        }
    }

    // 目标接口,或称为标准接口
    interface PhonePower {
        public String request();
    }

    // 具体目标类,只提供普通功能
    static class AndroidPower implements PhonePower {
        public String request() {
            return "5v直流电";
        }
    }
    //充电使用标准接口
    static class Android {
        public void charge(PhonePower power) {
            System.out.println(power.request() + "充电");
        }
    }

    // 适配器类,继承了被适配类,同时实现标准接口
    static class PowerAdapter extends HomePower implements PhonePower {
        public String request() {
            return super.homeRequest();
        }
    }

    // 测试类public class Client {
    public static void main(String[] args) {
        new Android().charge(new AndroidPower());
        //有了电源适配器安卓就可以使用220v充电
        new Android().charge(new PowerAdapter());
    }
}
输出:
5v直流电充电
220V交流电充电

下面是对象适配器模式:

public class Adapter {
    static class HomePower {
        public String homeRequest() {
            return "220V交流电";
        }
    }

    // 只有具体目标类,目标接口是因为java不支持多继承
    static class AndroidPower {
        public String request() {
            return "5v直流电";
        }
    }
    //充电使用标Android接口
    static class Android {
        public void charge(AndroidPower power) {
            System.out.println(power.request() + "充电");
        }
    }

    // 适配器类,这里直接继承普通接口,不用实现目标接口,
    static class PowerAdapter extends AndroidPower {
        private HomePower homePower;
        PowerAdapter(HomePower homePower){
            this.homePower = homePower;
        }
        public String request() {
            return this.homePower.homeRequest();
        }
    }

    // 测试类public class Client {
    public static void main(String[] args) {
        new Android().charge(new AndroidPower());
        //有了电源适配器安卓就可以使用220v充电
        new Android().charge(new PowerAdapter(new HomePower()));

//使用匿名内部类来继承   
//        new Android().charge(new AndroidPower(){
//            @Override
//            public String request() {
//                return new HomePower().homeRequest();
//            }
//        });
    }
}
输出:同上

最后说一下,就像真实中一样,适配器一般解决历史遗留问题。所以适配器模式在软件设计阶段是不能出现的。个人推荐使用对象适配模式,其中也可以像注释的那样使用匿名内部类。

;