设计模式中,适配器模式作为结构型设计模式,常常被人在项目中使用。适配器模式设计思想是将两个功能不同的接口整合起来一起使用,适配器发挥着连接的适配作用。比如电脑与内存卡,这是两个不一 样功能的载体,可以当作两个不同的接口,而读卡器(在这里就是适配器),可以连接电脑和内存卡,电脑可以通过读卡器读取内存卡,使得电脑和内卡同时工作。再比如中国的家用电压是220V,日本的家用电压是110V,为了使得电器能够在不同的电压环境下工作,电压转化器(在这里就是适配器)就发挥着连接和适配的作用。
优点:使得两个功能不同的接口可以一起工作,通过适配器类解耦目标类和适配者类,提高类的复用性。
缺点:最多只能适配一个适配者类,适配器模式中只能为目标抽象类,适配器太多会导致系统代码结构不清晰。
本文简单采用一个例子:Ipad和Iphone的文件读取功能。我们把Ipad和Iphone这两个不同功能载体当作两个不同的接口,现需要实现在Ipad中读取Iphone的文件,其中,TypeC连接线就是我们的适配器,TypeC接口连接了Ipad和Iphone,使得Ipad可以读取Iphone的文件,两者的文件都可以同时读取得到。
采用适配器模式,设计思路如下:
Ipad接口
public interface Ipad {
public void play(String type);
}
Iphone接口
public interface Iphone {
public void paly(String type);
}
IphoneReader类,用于读取iPhone的文件系统
package adapter;
/**
* 该类模拟具有iPhone文件系统读取的功能
* @author jsyuger
*/
public class IphoneReader implements Iphone {
@Override
public void paly(String type) {
System.out.println("Reader reads iphone files!");
}
}
TypeCAdapter类,适配器,用于iPad适配iPhone的文件读取
package adapter;
/**
* 适配器,连接ipad和iPhone的typeC
* @author jsyuger
*/
public class TypeCAdapter implements Ipad{
//基于ipad的接口,同时适配了苹果的IphoneReader
private IphoneReader iphoneReader = new IphoneReader();
@Override
public void play(String type) {
iphoneReader.paly(type);
}
}
MediaReader类,用于读取ipad的文件系统以及通过适配器读取iPhone的文件系统
package adapter;
/**
* ipad的文件读取器,具有适配typeC接口的特点
* 读取原理:先在ipad读取文件,若没有,则在iPhone上读取,ipad和iPhone上都没有,就报错
* @author jsyuger
*/
public class MediaReader implements Ipad{
@Override
public void play(String type) {
if(type.equals("ipad")) { //读取ipad,在ipad文件系统里面找
System.out.println("Reader reads ipad files!");
}else if(type.equals("iphone")) { //如果ipad文件系统没有,就调用TypeC适配器,去iphone文件系统里面找
TypeCAdapter typeCAdapter = new TypeCAdapter();
typeCAdapter.play(type);
}else{ //iPhone和ipad都找不到的文件,则报错
System.out.println("Type is not support!");
//new Exception("Type is not support!");
}
}
}
Reader测试类,模拟读取文件
package adapter;
import org.junit.Test;
/**
* 测试类,模拟读取文件
* @author jsyuger
*/
public class Reader {
@Test
public void test() {
MediaReader mediaPlayer = new MediaReader();
mediaPlayer.play("ipad");
mediaPlayer.play("iphone");
mediaPlayer.play("unkowned");
}
}
控制台输出:
Reader reads ipad files!
Reader reads iphone files!
Type is not support!
适配器模式分为对象适配器和类适配器,其设计思想和解决目标都是差不多的,都是为了兼容不同的接口使其同时工作,但有细微的实现区别,感兴趣的朋友可以了解一下。好了,水文就写到这里了,bye~