5 结构型模式之 - 适配器模式

2017-05-04 小Q

适配器模式的介绍:适配器模式在开发中使用率很高,适配器是将两个不兼容的类融合在一起,它有点像粘合剂,将不同的东西通过一种转换使得它们能够协作起来。例如经常碰到两个不相关的类之间进行交互,第一个解决方案是修改各自类的接口,但是如果没有源码或者我们不愿意为了一个应用而修改各自的接口,此时怎么办?这种情况我们往往会使用一个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 }

 


用户评论
开源开发学习小组列表