适配器模式的介绍
适配器模式在开发中使用率很高,适配器是将两个不兼容的类融合在一起,它有点像粘合剂,将不同的东西通过一种转换使得它们能够协作起来。例如经常碰到两个不相关的类之间进行交互,第一个解决方案是修改各自类的接口,但是如果没有源码或者我们不愿意为了一个应用而修改各自的接口,此时怎么办?这种情况我们往往会使用一个Adapter,在这两种接口之间创建一个“混血儿”接口,这个Adapter会将这两个接口兼容,在不修改源码的情况下满足需求。
适配器模式的定义
适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能在一起工作
适配器使用场景:
1 系统需要使用现有的类,而此类的接口不符合系统的需要,即接口不兼容
2 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作
3 需要一个统一的输出接口,而输入端的类型不可预知
用电源接口做例子,笔记本电脑的电源一般都是5V电压,但是我们生活中的电线电压一般都是220V,这个时候就出现了不匹配的情况,不软件开发中我们称之为接口不兼容,此时就需要适配器来进行一个接口转换,在软件开发中有一句话正好体现了这点:任何问题都可以加一个中间层来解决。这个层我们可以理解为这里的Adapter层,通过这层来进行一个接口转换就达到了兼容的目的。
适配器模式分分两种:
1)类适配器模式
2) 对象适配器模式
先说第一种类适配器模式:
5V电压的接口,代码如下:
/**
* Target角色,就是要转换成的5V的
*/
public interface FiveVolt {
int getVolt5();
}
220V的电压,需要被转换的
/**
* 220V的电压,被转换的类
*/
public class Volt220 {
public int getVolt220(){
return 220;
}
}
下面是Adapter角色,将220V的电压转换成5V的电压
/**
* 适配器,即有5V的,又有220V的,就像转换头一样,两边都可以兼容
*/
public class ClassVoltAdapter extends Volt220 implements FiveVolt {
@Override
public int getVolt5() {
return 5;
}
}
看到没,上面的ClassVoltAdapter里面即有220V的,又有5V的,需要5V的也可以用,需要220V的也可以用。
下面是类适配器模式的测试类:
/**
* 下面是类适配器模式的测试类
*/
public class ClassAdapterTest {
public static void main(String[] args){
test();
}
public static void test(){
ClassVoltAdapter voltAdapter = new ClassVoltAdapter();
System.out.println(voltAdapter.getVolt5());
}
}
下面再来看看第二种适配器模式:对象适配器模式
首先前面的 5V的接口和220V的类还是一样的。这里只是把代码贴出来供方便查看的。
5V电压的接口,代码如下:
/**
* Target角色,就是要转换成的5V的
*/
public interface FiveVolt {
int getVolt5();
}
220V的电压类
/**
* 220V的电压,被转换的类
*/
public class Volt220 {
public int getVolt220(){
return 220;
}
}
下面看一下对象适配器类:主要是实现了目标接口,并且保存了一个被转换的类的对象的引用 ,代码如下:
/**
* 对象适配器,实现目标接口,保存一个被转换对象的引用
*/
public class ObjectVoltAdapter implements FiveVolt{
//保存一个被转换对象的引用
Volt220 volt220;
public ObjectVoltAdapter(Volt220 volt220){
this.volt220 = volt220;
}
@Override
public int getVolt5() {
return 5;
}
public int getVolt220(){
return volt220.getVolt220();
}
}
下面是对象适配器模式测试类:
/**
* 对象适配器的测试类
*/
public class ObjectVoltAdapterTest {
public static void main(String[] args){
test();
}
public static void test(){
//创建一个220V的电压类的对象,也就是被转换的类的对象
Volt220 volt220 = new Volt220();
//创建一个对象适配器类的对象,并且保存一个被转换的类的对象
ObjectVoltAdapter voltAdapter = new ObjectVoltAdapter(volt220);
System.out.println(voltAdapter.getVolt5());
}
}