导引
例子1
例子2
其实例子1和例子2是算是一个例子哈,嗯,上面的例子主要突出了一个重点:适配。把原本不适配的东西通过某一种中介让他们能够一起工作。重点来了,这就要提到适配器模式了。
问题1:适配器模式是什么?有什么用意?
定义:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。匹配
用意:将接口不同而功能相同或者相近的两个接口加以转换
问题2:适配器模式有哪些分类?
适配器模式有两种:类的适配器模式和对象的适配器模式
类的适配器
问题3:UML图
问题4:类的适配器有什么特点?
适配器是源的子类,可以在适配器类中置换掉源的一些方法;
Adapter扩展了Adaptee又实现了Target,Adaptee没有的方法就会实现
问题5:类的适配器有哪些角色?
- 目标角色Target:期待得到的接口,目标不能是类,而是接口
public interface Target {
void simpleOperation1();
void simpleOperation2();
}
- 源角色Adaptee:现有需要适配的接口
public class Adaptee {
public void simpleOperation1() {
}
}
- 适配器角色Adapter:适配器类是本模式的核心,把源接口转换成目标接口,不能是接口,必须是具体类
public class Adapter extends Adaptee implements Target {
@Override
public void simpleOperation2() {
}
}
对象的适配器
问题6:UML图
问题7:对象的适配器有什么特点?
使用委派关系(关联)连接到Adaptee类
问题8:对象的适配器有哪些角色?
- 目标角色Target:期待的接口,目标可以是具体的或者抽象的类。
public interface Target {
/**
* 源也有的方法
*/
void simpleOperation1();
/**
* 源没有的方法
*/
void simpleOperation2();
}
- 源角色Adaptee:现有需要适配的接口
public class Adaptee {
void simpleOperation1(){
}
}
- 适配器角色Adapter:本模式的核心,把源接口转换成目标接口,必须是具体类
public class Adapter implements Target{
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
super();
this.adaptee = adaptee;
}
/**
* 源类有的,直接委派
*/
@Override
public void simpleOperation1() {
adaptee.simpleOperation1();
}
/**
* 源类没有的,补充
*/
@Override
public void simpleOperation2() {
}
}
问题9:与类的适配器相比有什么不同?
一个适配器可以把多种不同的源适配到同一个目标中,换言之,同一个适配器可以把源类和它的子类都适配到目标接口。
与类的适配器模式相比,想要置换源类的方法就不容易。如果一定要置换掉源类的一个或多个方法,就只好先做一个源类的子类,将源类的方法置换掉,然后把源类的子类当做真正的源进行适配。
虽然想要置换源类的方法不容易,当时想要增加一些新的方法方便得很,且新增加的方法可同时适用于所有的源。
问题10:有什么需要注意的?
适配器是AdapterView视图与数据之间的桥梁,用来处理数据并将数据绑定到AdapterView上
目标接口可以省略,此时,源接口和目标接口实际上是相同的,
由于源方式一个接口,而适配器类是一个类或者抽象类,
可以使客户端不必实现不需要的方法。适配器类可以使抽象类。
带参数的适配器模式 ,使用这种办法,适配器类可以根据参数
返回一个合适的实例给客户端。
注意!注意!从上面第2点和第3点可以引出一个略有不同的适配器模式——缺省适配模式。
缺省适配模式
问题11:UML图
问题12:为什么会用到缺省适配模式?
很多情况下,必须让一个具体类实现某一个接口,但是这个类又用不到接口所规定的所有方法,所以就需要用到缺省适配模式。
(PS:在学习适配器模式的适合,肯定会不自觉与平时我们常用的adapter相结合啊,但怎么看怎么觉得别扭,但是看到缺省适配模式的时候,嗯,想通了!)
问题13:怎么用?
可以设计一个抽象的适配器类实现接口,此抽象类要给接口所要求的每一种方法都提供一个空的方法,任何继承抽象类的具体类都可以选择它需要的方法实现。
问题14:适配器模式在Android中的一些应用。
ListView-列表控件视图
RecyclerView-进阶的ListView
Gallery-缩略图浏览器控件
GridView-网格控件
Spinner-下拉列表控件
AutoCompleteTextView-自动提示文本框
ExpandableListView-支持展开/收缩功能的列表控件
ViewPager
问题15:Android适配器的种类
SimpleAdapter(已经记不住了)
BaseAdapter(常用)
ArrayAdapter(不怎么用)
CursorAdapter(API上写的常见的)
SimpleCursorAdapter(同上)
……
问题16:Adapter和AdapterView啥关系?
结尾
参考用书:《Java与模式》