您的位置:首页 > 其它

适配器模式

2015-12-10 11:41 267 查看
什么是适配器模式

生活中的例子

适配器模式的模块图

再论适配器在Android中的AdpaterView

什么是适配器模式

将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。——Gang of Four

 接触适配器模式是在Android的ListView中的,个人感觉其实就是有一个A类,他有一个方法A.method()需要使用B类数据,但是可能B类数据和A类的内部实现不太一样,这时并不是修改A类或者B类,而是通过一个适配器,使得适配器从B类获取数据,A从适配器获取数据,从而完成了相应的功能,那么如果有一个C类过来时,就再根据需要写一个适配器就可以了,这样实现了程序之间的松耦合

生活中的例子

 虽然这样看来有些奇怪,但是假设你有一台笔记本电脑,你想要接一个PS2键盘,但是你的笔记本只有USB接口,这时候你想要在用PS/2键盘在笔记本上打字,就需要一个适配器,一头接USB,一头接PS/2,下面一段代码,演示了这个过程。

首先,我们定义一台笔记本

package adapterMode;

public class LapTop {

private Target target;
//打字方法,注意这里对电脑而言是调用的适配器来打字
public void printSomething(){
target.adpateUSB();
}
public void setAdapter(Target target){
this.target = target;
}
}


接着,我们定义一个键盘

package adapterMode;

public class PS2Keyboard {

public void printWords(){
System.out.print("打印");
}

}


最后,我们来看看如何实现一个适配器

package adapterMode;
//适配器接口这个接口主要需要完成适配笔记本USB口的任务
public interface Target {
public void adpateUSB();
}


package adapterMode;
//具体的USB转PS/2的适配器
public class Adapter implements Target {
//通过组合的方法获得PS/2键盘的实例
private PS2Keyboard ps2Keyboard = new PS2Keyboard();

@Override
public void adpateUSB() {
ps2Keyboard.printWords();
}

}


以上功能齐了后,我们来看看如何完成打字

package adapterMode;

public class Main {

public static void main(String[] args) {
//获得一台笔记本电脑
LapTop thinkPad = new LapTop();
//获得一个USB转PS/2的适配器
Adapter AdapterUSBtoPS2 = new Adapter();
//适配器和电脑连上
thinkPad.setAdapter(AdapterUSBtoPS2);
//打字
thinkPad.printSomething();
}

}


 以上,便完成了从USB到PS/2的过程,如果还有更奇葩的接口的键盘,你需要做得仅仅是实现Target,完成相应的数据适配方法即可。

适配器模式的模块图

Created with Raphaël 2.1.0ClientInterface TargetClass Adapter implements TargetAdaptee

 暂时没做好图,大概就是上面的模式,一般情况,需要适配Client类到Adaptee类,我们令Target方法作为Client的抽象适配器,Client需要适配数据,仅仅需要调用Target的方法即可,具体数据适配,我们通过实现Target类的Adapter类实现多态性。

再论适配器在Android中的AdpaterView

 常用到的ListView其实是继承了AdapterView,在Android中我们使用ListView其实大概就是这样一个过程,AdapterView(ListView的父类)负责绘制等功能,这些功能的数据来源通过Adapter获取,我们通过实现Adapter完成对数据的获取,所以你实现的Adapter的几个方法就完成了数据到AdapterView的数据适配。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: