Java设计模式 - 适配器模式

作者: a57ecf3aaaf2 | 来源:发表于2016-10-09 15:23 被阅读736次

    概述

    将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

    构造器模式

    上面的概述可能不是太容易理解,下面举一个例子说明适配器模式的应用。

    大家都知道,新款iPhone 7手机使用了扁口的Lightning接口耳机插槽,而旧款的3.5mm普通耳机是否就不能使用了呢?其实不然,iPhone 7配件中随机附赠了一个小玩意,可直接将普通3.5mm耳机转换为iPhone 7可使用的耳机。

    而这个小配件就是一个适配器Adapter,iPhone 7就是目标接口Target,而普通的3.5mm耳机就是待适配者Adaptee。

    转接头 - Adapter 3.5mm耳机 - Adaptee iPhone 7 - Target

    再如,市面上出售的安卓数据线转iPhone Lightning接口的转换器,都可以被认为是一个Adapter,类似例子比比皆是。

    其实,适配器模式的核心,就是使得接口完全不相干的两个类可以协同工作。

    1、类的适配器模式
    /**
     * 带有lightning耳机接口的iPhone7 [Target - 目标接口]
     */
    public interface IPhone7 {
        void listenWithLightning();
    }
    
    /**
     * 普通3.5mm耳机 [Adaptee - 待适配者]
     */
    public abstract class Headphone {
        public abstract void listenWithCommon();
    }
    
    /**
     * lightning to 3.5mm耳机 转换器 [Adapter - 适配器]
     */
    public class HeadphoneAdapter extends Headphone implements IPhone7 {
    
        @Override
        public void listenWithLightning() {
    
        }
    
        @Override
        public void listenWithCommon() {
    
        }
    }
    

    HeadphoneAdapter 通过继承一个类,然后实现一个新的接口,完成了 HeadphoneIPhone7的兼容。

    像上面这个结构,在Java开发中非常常见,这属于类的适配器模式

    2、对象的适配器模式

    还有一种基于对象的适配器模式,即对象的适配器模式

    将上面的 HeadphoneAdapter 类做如下修改:

    /**
     * lightning to 3.5mm耳机 转换器 [Adapter - 适配器]
     */
    public class HeadphoneAdapter implements IPhone7 {
    
        private Headphone headphone;
    
        public HeadphoneAdapter(Headphone headphone) {
            this.headphone = headphone;
        }
    
        @Override
        public void listenWithLightning() {
    
        }
    
        public void listenWithCommon() {
            headphone.listenWithCommon();
        }
    }
    

    此时,HeadphoneAdapter 要将 Headphone 适配为 iPhone 7 可识别的耳机,直接持有该类的实例,调用该类的 listenWithCommon() 方法即可。 此为对象的适配器模式

    3、接口的适配器模式

    适配器模式中的第三种模式也非常常见——接口的适配器模式

    当不希望实现一个接口中所有的方法时,可以创建一个抽象类继承该接口,并实现空方法或默认方法,子类只需继承该抽象类即可。

    /**
     * 抽象适配器类
     */
    public abstract class Adapter extends Headphone implements IPhone7 {
        @Override
        public void listenWithLightning() {
    
        }
    }
    
    /**
     * 具体适配器类
     */
    public class HeadphoneAdapter extends Adapter {
        @Override
        public void listenWithCommon() {
    
        }
    }
    

    可以看到,HeadphoneAdapter 无需实现 listenWithLightning() 方法,该方法已由父类 Adapter 做了默认空实现。

    Android中的适配器模式

    public interface ListAdapter extends Adapter {
        //...
    }
    
    public interface SpinnerAdapter extends Adapter {
        //...
    }
    
    public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {
        //...
    }
    

    BaseAdapter 既实现了 ListView 的功能,也实现了 Spinner 的功能。

    本文由Fynn_原创,未经许可,不得转载!

    相关文章

      网友评论

      • luban_:我觉得接口适配器中为了实现实现单一接口,其实主要还是 明确的显示出,哪一个接口是真正去实现的,而不用担心那些空的实现的方法。 谢谢博主
      • 土豆真好吃:类适配器模式是通过多重继承对一个接口与另一个接口进行匹配,java并不支持多继承。。。
        a57ecf3aaaf2:@Alice314 implement

      本文标题:Java设计模式 - 适配器模式

      本文链接:https://www.haomeiwen.com/subject/xkopyttx.html