适配器模式
1.简介
适配器模式(Adapter Pattern)
,是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能
常见的几类适配器
类的适配器模式
想将⼀个类转换成满⾜另⼀个新接⼝的类时,可以使⽤类的适配器模式,创建⼀个新类,继承原有的类,实现新的接⼝即可对象的适配器模式
想将⼀个对象转换成满⾜另⼀个新接⼝的对象时,可以创建⼀个适配器类,持有原类的⼀个实例,在适配器类的⽅法中,调⽤实例的⽅法就⾏接⼝的适配器模式
不想实现⼀个接⼝中所有的⽅法时,可以创建⼀ 个Adapter,实现所有⽅法,在写别的类的时候,继承Adapter类即可
JDK中的InputStreamReader就是适配器。
2.接口的适配器
定义一个手机接口
public interface Phone {
/*
* 普通打电话
* */
void call();
/*
* 视频通话
* */
void vedio();
}
现在想要写一个实现类,但是这个实现类只想实现call()方法
(假设老年机),这时我们就可以定义一个适配器去实现Phone接口,然后定义一个类直接继承适配器然后重写call()方法即可。
适配器
public class PhoneAdapter implements Phone {
@Override
public void call() {
}
@Override
public void vedio() {
}
}
继承适配器
public class NokiaPhone extends PhoneAdapter {
//只重写call()方法即可。
@Override
public void call() {
System.out.println("诺基亚手机打电话");
}
}
3.类的适配器
想要将一个类装换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可
。
代码实现
假设我们再升级或者优化一个项目时,需要将老的模块中的相关功能进行升级扩展,这个功能目前是由模块中的某个类OldModule类进行实现
public class OldModule {
public void methodA(){
System.out.println("OldModule 中的 methodA...");
}
}
那么我们如何在不改动老模块中OldModule类的前提下,对其所负责的业务功能进行扩展升级呢?
接下来,我们先将要扩展升级的相关功能方法,包括现有功能的方法在目标接口TargetModule中进行定义
public interface TargetModule {
/**
* 和需要适配的类的方法名一样
*/
public void methodA();
/**
* 新的方法,如果有多个新的方法直接编写即可
*/
public void methodB();
public void methodC();
}
然后通过类的适配器,进行适配OldModule和TargetModule,这样就可以做到将⼀个类转换成满⾜另⼀个新接⼝的类,且不改动原有类
//继承OldModule 实现 TargetModule。
public class Adapter extends OldModule implements TargetModule{
/**
* 注意: 已经在OldModule中实现的 methodA()是不用再实现的
*/
/**
* 新增方法B
*/
@Override
public void methodB() {
System.out.println("Adapter 中的 methodB...");
}
/**
* 新的方法C
*/
@Override
public void methodC() {
System.out.println("Adapter 中的 methodC...");
}
}
测试
@Test
public void testClassAdapater(){
TargetModule targetModule = new Adapter();
targetModule.methodA();
targetModule.methodB();
targetModule.methodC();
}
/*
OldModule 中的 methodA...
Adapter 中的 methodB...
Adapter 中的 methodC...
*/