适配器模式在Android中的应用

来源:互联网 发布:淘宝怎么看店家vip 编辑:程序博客网 时间:2024/05/22 10:52

工资翻倍篇之适配器模式

先了解一下适配器的基本概念,然后再具体分析一些适配器的例子,最后通过Android开发中常用的适配器模式进行分析,保证对适配器模式理解透彻。

适配器模式可分为三类:类的适配器、对象的适配器、接口的适配器。

1、适配器的基本概念

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

1.1类适配器模式

说明:

当新接口出现的时候,由于和老的接口不兼容,这个时候,我们采用一个适配器类实现新的接口并且继承老的业务类,这样就能同时处理新老业务。

示例代码:


1.2对象适配器模式

说明:当新接口出现的时候,由于和老的接口不兼容,这个时候,我们采用一个适配器类实现新的接口并在内部持有一个老业务逻辑的对象,这样就能把对老接口的调用全部中转给老的业务逻辑,从而解决接口的兼容性问题

示例代码:


1.3接口适配器模式

说明:也叫缺省适配器模式,主要解决接口的复用问题:有时候可能我们的业务只需要使用接口中的某一个方法而不是全部方法,但是由于接口的语言特性而 不得不实现全部的抽象方法,这样就会使得接口的使用过程很麻烦,特别是接口中存在很多抽象方法的时候。面对接口的这类问题,我们可以采用一个抽象类(也可 以不是抽象类)去实现接口,然后让我们的类去继承这个抽象类同时只重写我们感兴趣的方法即可。


2、类的适配器和对象适配器的分析

2.1类的适配器

如上图,当我们的Client需要一个新功能的时候,我们定义了一个RequiredInterface,里面有我们需要实现的方法requiredMethod(),

刚好这个requiredMethod()需要的功能已经在ExistingClass中实现了,ExistingClass是已经存在的一个类,里面有我们需要的方法usefulMethod()。这个时候,我们要做的就是创建一个NewClass新类,让他继承自ExistingClass,然后实现RequiredMethod,重写requiredMethod,将usefulMethod()的逻辑委派为requiredMethod,这样就实现了接口的适配了。

类适配器例子

火箭公司有一个火箭仿真事件EventSim,里面有很多仿真的火箭RocketSim。RocketSim是一个接口,想要加入EventSim的火箭都必须要实现RocketSim接口。


现在有一款火箭PhysicalRocket,这款火箭提供的功能和RocketSim相似,我们需要把这款火箭放到火箭仿真功能EventSim中,这个时候我们可以运用适配器模式,创建一个新的OozinozRocket继承PhysicalRocket同时实现RocketSim类。新的rocket就同时具有PhysicalRocket的属性和仿真属性了。

同时我们需要将PhysicalRocket中的功能getBurnTme,getMass,getThrust委派给新的OozinozRocket的getMass,getThrust。

这样一来OozinozRocket就能放到仿真功能EventSim中了。

以上就是类的适配器,通过子类进行适配。 在类的适配器中,新的适配类OozinozRocket实现了需要的接口RocketSim,并继承了现有的类PhysicalRocket。当你需要适配的一组方法并非被定义在接口中时,这种方法就不奏效了。此时需要创建一个对象适配器,它使用了委派并非继承。

2.2对象适配器


和上面的类的适配器进行比较可以发现,类的适配器中需要的是一个接口RequiredInterface,而对象适配器中需要的是一个类RequiredClass。

这个时候就不能使用类的适配器了,而需要使用对象适配器。

这里的NewClass是对象适配器的例子,NewClass实现了RequiredClass,这样就满足了客户端的需要,同时NewClass和ExistingClass是关联关系,ExistingClass是NewClass中的一个成员变量。


对象适配器例子

例子和上面类的适配器相似,不过多赘述

这里的仿真事件中需要的不再是接口,而是一个Skyrocket类。

我们的对象适配类OozinozSkyrocket实现了Skyrocket,内部并持有一个PhysicalRocket。因为子类只能继承一个父类,所以OozinozSkyrocket想要具有PhysicalRocket的功能就必须持有一个PhysicalRocket对象,然后将需要的功能委派给OozinozSkyrocket。

初始化的时候需要传入一个PhysicalRocket对象对内部持有的PhysicalRocket进行初始化。

如此就将PhysicalRocket通过OozinozSkyrocket适配类适配成需要的Skyrocket类了。所以适配器的目的就是将一个类适配成需要的一个类。


现在再来看开头的一些概念,就会觉得清晰很多了。

可能你还有一点模糊,但是你的功底已经练得差不多了,不过就只差打通任督二脉的那一股劲了。

我们来看看android开发中我们常遇到的适配器模式,你就会豁然开朗了。

3、Android中的适配器模式

在开发android程序时,我们用到最多的适配器模式就是写listView的时候常用到的BaseAdapter。

ListView控件大家再熟悉不过了,要想将一组数据显示到listView上,就必须要新建一个MyAdapter继承自BaseAdapter,然后

listView.setAdapter(myAdapter);将我们的数据设置到listView控件上进行显示。

所以我们必须将我们需要显示的一组数据适配成BaseAdapter,我们新建一个MyAdapter继承自需要的类BaseAdapter,然后内部持有我们需要显示的数据,这是典型的对象适配器。

android中的ListView控件,在显示listView列表的时候,并不是将每一组数据都硬塞给控件,而是定义了ListAdapter接口,ListView的实现使用了ListAdapter接口。我们的BaseAdapter实现了ListAdapter,然后我们提供了一个适配器,将数据转换为BaseAdapter。

不仅是Android的ListView,Swing提供的显示列表的空间JTable也是用到了对象适配器。




0 0