设计模式相关面试问题-适配器
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"); } }
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()方法:
现定位到makeAndAddView()方法,其中定义到它:
而这个方法其实是定义在它的父类AbsListView当中的,如下:而该方法的代码量也是非常之大,继续挑重点分析,如下: