我们在开发Android的时候经常通过Adapter把数据和UI对象连接在一起,spinner、ListView之类的控件都可以用适配器来自定义其组建,使其更加丰富。适配器模式是将两个不兼容的类纠合在一起使用,属于结构型,需要有Adaptee(被适配者)和Adaptor(适配器)两个身份。简单的来说,就是你有一个机器人是只会踢足球的,另一个机器人只会打篮球的,然后你想有让他既会踢足球又会打篮球,那他的芯片里要将这两种方法都集合在一起,可我们又不知道原来的踢足球和打篮球的方法是怎么写的,也不想改啊,也就是需要适配器模式,来把它们糅杂在一起啦。
适配器模式呢大致分为两种,一种是组合的方式对象适配器,另一种是继承的方式类适配器,其他还有各种衍生。
借助慕课网的教学ppt,我们来看一下什么是对象适配器
对象适配器就是把一个“被适配者”作为一个对象组合到适配器类中,以修改目标接口包装适配者,下面我们通过一个二相插头和三相插头的转换电流例子来看一下这种模式的运用。
我们先来看一下使用场景,我们带了一个笔记本和一个插座。
我们带的笔记本
public class NoteBook { private ThreePlugIf plug; public NoteBook(ThreePlugIf plug){ this.plug = plug; } //使用插座充电 public void charge(){ plug.powerWithThree(); }
笔记本三相电流的插口
public interface ThreePlugIf { //使用三相电流供电 public void powerWithThree(); }
我们带的插座
public class GBTwoPlug { //使用二相电流供电 public void powerWithTwo(){ System.out.println("使用二相电流供电"); } }
以上情况我们发现一个窘境,我们有一个笔记本必须使用三相电流,可我们只有二相电流插座,那怎么办呢,那我们就要一个转换器啦。
public class TwoPlugAdapter implements ThreePlugIf { private GBTwoPlug plug; public TwoPlugAdapter(GBTwoPlug plug){ this.plug = plug; } @Override public void powerWithThree() { System.out.println("通过转化"); plug.powerWithTwo(); } }
我们的适配器类继承了三项插座接口,实现了其输电方法,并将二相电流类作为参数对象传入。我们怎么使用这个适配器呢?
GBTwoPlug two = new GBTwoPlug(); ThreePlugIf three = new TwoPlugAdapter(two); NoteBook nb = new NoteBook(three); nb.charge();
答案就是我们用我们新的子类(适配器类)实例化父类(三相插座接口),新生成的对象可以调用子类的方法powerwithThree(),实现供电转化。
那么什么是类适配器呢?
类适配器模式就是通过多重继承不兼容接口,实现对目标接口的匹配,单一的唯某个类而实现适配的这样一种模式。
public class TwoPlugAdapterExtends extends GBTwoPlug implements ThreePlugIf { @Override public void powerWithThree() { System.out.print("借助继承适配器"); this.powerWithTwo(); } }
看完适配器的两种模式,我们来对比一下
类适配器只能为单一的某个类而实现,复用性较差
对象适配器可以为不同的对象实现适配,使用性较强!
我们Android开发中使用的适配器是他们的一个变形,大家可以阅读下Android源代码研究下,万变不离其中嘛
Android开发之适配器模式初探