适配器模式

得心应手的“粘合剂”-适配器模式

定义

适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法一起工作的两个类能够在一起工作

使用场景

  1. 系统需要使用现有的类,而此类的接口不符合系统的需要,即接口不兼容
  2. 想要建立一个可以重复使用的类,用于与彼此之间太大关联的一些类,包括一些可能在将来引进的类一起工作
  3. 需要一个统一的输出接口,而输入端的类型不可预知

简单实现

类适配器

target 角色

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
package AdapterMode.Class;
//target 角色
public interface FiveVolt {
    public int getVolt5();
    public class Volt220{
        public int getVolt220(){
            return 220;
        }
    }
}

适配器类

1
2
3
4
5
6
7
package AdapterMode.Class;

public class VoltAdapter extends FiveVolt.Volt220 implements FiveVolt {
    public int getVolt5() {
        return 5;
    }
}

测试类

1
2
3
4
5
6
7
8
package AdapterMode.Class;

public class Test {
    public static void main(String[] args) {
        VoltAdapter voltAdapter=new VoltAdapter();
        System.out.println("输出电压"+voltAdapter.getVolt5());
    }
}

对象适配器

target角色

1
2
3
4
5
6
package AdapterMode.Object;

//target 角色
public interface FiveVolt {
    public int getVolt5();
}

适配器角色,转换的角色

1
2
3
4
5
6
7
package AdapterMode.Object;
//adapter 角色,需要被转换的角色
public class Volt220 {
    public int getVolt220(){
        return 220;
    }
}

适配器类

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
package AdapterMode.Object;

public class VoltAdapter implements FiveVolt {
    Volt220 volt220;
    public VoltAdapter(Volt220 adaptee){
        volt220=adaptee;
    }
    public int getVolt220(){
        return volt220.getVolt220();
    }

    public int getVolt5() {
        return 5;
    }
}

测试类

1
2
3
4
5
6
7
8
package AdapterMode.Object;

public class Test {
    public static void main(String[] args) {
        VoltAdapter voltAdapter=new VoltAdapter(new Volt220());
        System.out.println("输出电压"+voltAdapter.getVolt5());
    }
}

输出结果

object.png

总结

优点

  1. 更好的复用性 系统需要使用现有的类,而此类的接口不符合系统的需要,那么通过适配器模式就可以让这些功能得到更好的复用
  2. 更好的拓展性 在实现适配器功能的时候,可以调用自己开发的功能,从而自然的拓展系统的功能

缺点

  1. 过多地使用使用适配器,会使得系统非常凌乱,不易整体把握。 例如,明明看到的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此,如果不是很有必要,可以不使用适配器,而是直接使用对系统的重构。