走穿23种设计模式-8适配器模式详解
适配器模式,也叫变压器模式。在适配器模式下,变压器的作用是把一种电压变成另一种电压。
上面是用生活相关的词语解析。
其实适配器对我们Android程序员来说是非常非常熟悉的了,我们使用ListView就要用到适配器Adapter,这里适配器的作用就是把一些数据(经过一定的封装/排序),变成我们一列列的数据。
一.适配器模式的现实场景:人工翻译
王小华打算去图书馆借书,但是因为是新生,不熟悉路,正愁时对面走来一个外国朋友。王小华上前打听,可是英语水平有限,没有办法与对方进行交流。此时,他的同学李良刚好经过,而且他的英语口语很好,王小华请李良做他的翻译跟对方交流,最终他顺利知道去图书馆的路。
在上面场景中,王小华需要知道去图书馆的路,外国友人知道去图书馆的路,但是王小华听不懂英语,这是需要李良这个翻译把英语翻译过来,这里李良就相当于一个适配器的作用,把一种语言变成另一种需要的语言。
二.适配器模式(Adapter Pattern)的定义
将一个类的接口变成客户端所期待的另一个接口,从而使原本应接口不匹配而无法在一起工作的两个类能够在一起。
三.适配器模式的类图
四.适配器设计的三个角色
1.目标角色(Target):该角色定义要转换成的目标接口。
2.源角色(Adapee):需要被转换成目标角色的源角色。
3.适配器角色(Adapter):该角色是适配器模式的核心,其职责是通过继承或者类相关的方式,将源角色转换成目标角色。
五.适配器的优点
1.适配器可以让两个没有任何广西的类在一起运行。
2.增加了类的透明性
3.增加了类的复用性
4.增加了代码的灵活性
六.适配器模式的使用场景
修改一个已经投产的系统时,需要对系统进行扩展,如果需要一个已有的类进行扩展,这个类不符合接口,这时使用适配器模式是最适合的,这样可以将一个不符合系统接口的类转换成符合系统接口、可以使用的类。
适配器模式的实例
这里以文中开头的现实场景:将中文转换为英文做实例代码设计。
实例类图
这里和上面适配器模式类图的样式有点不一样。
适配器角色可以继承源角色关联源角色,也是可以把适配器角色对象放到源角色中进行相关,Android中的listView就是用第二种来相关的。
实例代码
1.目标角色IEnglish
package p8_adapter;
/**
* 目标角色
* 定义源角色要变成上面样子的规范接口
*/
public interface IEnglish {
public void speakEnglish(String chinese);
}
2.适配器角色TranslaterAdapter
package p8_adapter;
/**
* 语言适配器
* 将中文转化成英文
* 这里的适配器是做实际的操作
*/
public class TranslaterAdapter implements IEnglish {
/**
* 将中文翻译成英文的一个类
*/
@Override
public void speakEnglish(String chinese) {
System.out.println("适配器把中文:‘" + chinese + "’翻译成英文:");
System.out.println("Hello,where is the library?");
}
}
3.源角色Chinese
package p8_adapter;
/**
* 源角色,没经过转换前的对象数据
*/
public class Chinese {
String msg;
//构造方法
public Chinese(String message) {
System.out.println("问:" + message);
msg = message;
}
//添加适配器,并要适配器做操作
public void setAdatper(IEnglish english) {
english.speakEnglish(msg);
}
}
4.适配器测试类AdapterDemo
package p8_adapter;
/**
* 适配器模式测试类
*/
public class AdapterDemo {
public static void main(String[] arg) {
Chinese chinese = new Chinese("请问图书馆怎么走??");//创建源对象
IEnglish adapter = new TranslaterAdapter();//创建适配器对象,这里用多态
chinese.setAdatper(adapter);//把适配器对象放到源对象做操作
}
}
到这里适配器模式就简单介绍完了。
但是鉴于我们Android开发者对ListView的适配器Adapter的熟悉,我还是对Android适配器和设计模式的适配器做一些个人理解说給大家听:
我们android经常使用的Adapter:BaseAdapter、ArrayAdapter、SimpleAdapter。
BaseAdapter就像适配器模式中的目标角色,定义了基本接口和方法,你实现了BaseAdapter后实现相关的方法就可以得到适配器角色。接着就可以給适配器放入数据进行整合。
而ArrayAdapter和SimpleAdapter已经是适配器角色,可以直接放入数据,实现数据的整理功能。
通过适配器的方法接收把数据源对象的数据,刷新适配器。
大家也可以看看,我之前写的几种模式的详解:
装饰模式:http://blog.csdn.net/wenzhi20102321/article/details/78336273
代理模式:http://blog.csdn.net/wenzhi20102321/article/details/78209493
创建型模式详解:http://blog.csdn.net/wenzhi20102321/article/details/78175558
原型模式:http://blog.csdn.net/wenzhi20102321/article/details/78167984
建造者模式:http://blog.csdn.net/wenzhi20102321/article/details/78163855
抽象工厂模式:http://blog.csdn.net/wenzhi20102321/article/details/78153437
工厂方法模式:http://blog.csdn.net/wenzhi20102321/article/details/78129065
可以仔细对比一下工厂方法模式和抽象工厂模式,看看概念,看看类图,看看代码,就会明白了。
单例模式:http://blog.csdn.net/wenzhi20102321/article/details/77882203
java 23种设计模式介绍:http://blog.csdn.net/wenzhi20102321/article/details/54601909