前言
本章讲解适配器模式的相关知识
方法
1.概念
在讲解有关适配器的相关知识之前,有必要了解一下适配器模式的应用场景。
在升级老系统的时候,我们发现有一些类中的方法我们舍不得抛弃,但是新系统又不能直接用这些方法。如果编写新的方法的话又会写一些和老系统方法重复的代码,这个时候我们可以利用适配器模式做到新系统的类方法可以调用老系统的类方法,并在上面加以修饰,达到了适配的目的,同时使代码得到有效的复用。
生活中有许多适配器模式的例子。拿苹果手机为例,在iphone6的时候,有专用的耳机孔可以听歌。然而在iphone7,苹果公司取消了耳机插口,与充电线插口融为一体,那么老实的耳机线就需要一个转接口(适配器)来进行连接满足需求。
在这里注意几个关键词:
需要被适配的类:iphone6的耳机插孔
适配器类:耳机线转接口
客户端类:iphone7耳机插孔
2.适配器模式的实现
1)类适配器模式
创建相应的工程:
Iphone6:代表需要被适配的类,有标准的3.5mm音频输出接口听歌
Iphone7:客户端,需要使用Iphone7充电插孔听歌
Lightning:Iphone7听歌使用的Lightning接口
LightningAdapter:Iphone7使用Iphone6耳机线时用到的适配器
各个类的代码如下:
Iphone6:
package adapter;
/**
* 需要被适配的类Iphone6,它拥有标准的3.5mm音频输出接口
* @author jwang
*
*/
public class Iphone6 {
//听歌方法
public String music(){
String str = "使用标准的3.5mm音频输出接口听歌";
System.out.println(str);
return str;
}
}
Iphone7:
package adapter;
/**
* 客户端类Iphone7,它拥有标准的lightning接口
* @author jwang
*
*/
public class Iphone7 {
//听歌方法
public String music(Lightning lightning){
String str = lightning.change35mmToLightning();//调用转换器方法
System.out.println(str);
return str;
}
//测试方法
public static void main(String[] args) {
Iphone7 iphone7 = new Iphone7();//创建客户端
Lightning adapter = new LightningAdapter();//创建适配器
iphone7.music(adapter);
}
}
Lightning:
package adapter;
/**
* Lightning接口
* @author jwang
*
*/
public interface Lightning {
//转换器接口
public String change35mmToLightning();
}
LightningAdapter:
package adapter;
/**
* 适配器类,用于将标准的3.5mm音频输出接口转化为Lightning接口
* @author jwang
*
*/
public class LightningAdapter extends Iphone6 implements Lightning {
@Override
public String change35mmToLightning() {
String musicType = super.music();//获得原来使用的接口
//转换成转换成Lightning接口
musicType = "转换成Lightning接口进行听歌...";
System.out.println(musicType);
musicType = "使用Lightning接口进行听歌";
System.out.println(musicType);
return musicType;
}
}
运行客户端类代码结果如下:
由于其直接继承了被适配对象的类,那么扩展能力将大大降低,我们大多数情况下使用第二种适配器模式的实现方式:对象适配器模式
2)对象适配器模式
更改适配器类代码如下所示:
package adapter;
/**
* 适配器类,用于将标准的3.5mm音频输出接口转化为Lightning接口
* @author jwang
*
*/
public class LightningAdapter implements Lightning {
private Iphone6 iphone6;
public LightningAdapter(Iphone6 iphone6) {
this.iphone6 = iphone6;
}
@Override
public String change35mmToLightning() {
String musicType = iphone6.music();//获得原来使用的接口
//转换成转换成Lightning接口
musicType = "转换成Lightning接口进行听歌...";
System.out.println(musicType);
musicType = "使用Lightning接口进行听歌";
return musicType;
}
}
更改客户端Iphone7代码如下:
package adapter;
/**
* 客户端类Iphone7,它拥有标准的lightning接口
* @author jwang
*
*/
public class Iphone7 {
//听歌方法
public String music(Lightning lightning){
String str = lightning.change35mmToLightning();//调用转换器方法
System.out.println(str);
return str;
}
//测试方法
public static void main(String[] args) {
Iphone6 iphone6 = new Iphone6();
Iphone7 iphone7 = new Iphone7();//创建客户端
Lightning adapter = new LightningAdapter(iphone6);//创建适配器
iphone7.music(adapter);
}
}
执行结果如下所示: