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