设计模式相关面试问题-适配器

adapter模式详解:

  • 适配器模式定义
    将一个接口转换成客户端希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。
  • 类适配器
    ①、类适配器定义:
    类适配器模式把适配的类的API转换成目标类的API。
    ②、UML结构图解析:

    ③、code详解:
    先定义Target接口:
    public interface Target {
    
        void sampleOperation1();
    
        void sampleOperation2();
    }

    再定义类Adaptee:

    public class Adaptee {
        public void sampleOperation1() {
            System.out.println("sampleOperation1");
        }
    }

    接着定义Adapter类:

    public class Adapter extends Adaptee implements Target {
        @Override
        public void sampleOperation2() {
            System.out.println("sampleOperation2");
        }
    }
    应用一下:

    ④、总结:
    a、类适配器使用对象继承的方式,是静态的定义方式。
    b、对于类适配器,适配器可以重定义Adaptee的部分行为。
    c、对于类适配器,仅仅引入了一个对象,并不需要额外的引用来间接得到Adaptee。
    d、对于类适配器,由于适配器直接继承了Adaptee,使用适配器不能和Adaptee的子类一起工作。
  • 对象适配器
    ①、对象适配器定义:
    与类的适配器模式一样,对象的适配器模式把被适配的类的API转换成为目标类的API,与类的适配器模式不同的是,对象的适配器模式不是使用继承关系连接到Adaptee类,而是使用委派关系连接到Adaptee类。
    ②、UML结构图解析:

    ③、code详解:
    其Target接口还是跟之前类适配器一样:
    public interface Target {
    
        void sampleOperation1();
    
        void sampleOperation2();
    }

    Adaptee也跟之前类适配器一样:

    public class Adaptee {
        public void sampleOperation1() {
            System.out.println("sampleOperation1");
        }
    }
    接着不同点来啦,看此时的Adapter类:
    public class Adapter implements Target {
    
        private Adaptee adaptee;
    
        public Adapter(Adaptee adaptee) {
            this.adaptee = adaptee;
        }
    
        @Override
        public void sampleOperation1() {
            adaptee.sampleOperation1();
        }
    
        @Override
        public void sampleOperation2() {
            System.out.println("sampleOperation2");
        }
    }

    持有Adaptee的引用了,而不是继承至它,接着再应用一下:

    ④、总结:
    a、对象适配器使用对象组合的方式,是动态组合的方式。
    b、对于对象适配器,一个适配器可以把多种不同的源适配到同一个目标。
    c、对于对象适配器,要重定义Adaptee的行为比较困难。
    d、对于对象适配器,需要额外的引用来间接得到Adaptee。

adapter模式在android中的实际运用:

ListView使用了adapter模式我想不多过多解析下,分如下两点进行:

  • UI
    先上张图:

    1、ListView的布局是由一条一条的Item组成的,这每一个Item又是一个View。通过Adapter适配器这个桥梁将View添加到ListView中。
    2、一个Adapter是AdapterView视图与数据之间的桥梁,Adapter提供对数据的访问,也负责为每一项数据产生一个对应的View。
    3、每一项数据产生对应的View之后,然后将View添加到ListView之中。
    4、属于MVC架构,其中Adapter属于C。
  • 源码
    跟ListView的recycleBin类似其adapter的定义是在ListView的父类当中,如下:

    此时在onAttachedToWindow()方法中看到有如下代码:

    而在此方法中也发现了另外一种模式:观察者,如下:

    这个模式不是此次探讨的重点,在未来会专门去研究。
    此时将观注点转移到这里来:

    所以回到ListView的layoutChildren()方法来查看,不过它的代码量实在太大,挑重点理解就行:

    然后再查看fillUp()方法:

    扫描二维码关注公众号,回复: 110737 查看本文章

    现定位到makeAndAddView()方法,其中定义到它:

    而这个方法其实是定义在它的父类AbsListView当中的,如下:

    而该方法的代码量也是非常之大,继续挑重点分析,如下:

猜你喜欢

转载自www.cnblogs.com/webor2006/p/8991832.html