我们可能遇到过这样的问题:我们新买了一个显示器,但是由于电脑是几年以前的,不能直接连上使用,需要在连接的时候,安装一个转接头。
还有,我们使用的手机充电线有一个大大的头,而不是直接一根线连在手机上,手机上的充电电压一般是5v,9v等,但绝不是220v。
还有苹果的手机等等,很多时候都会遇到需要转接头的时候。
在我们软件开发的过程中,比如对某个产品升级,但是还是要兼容原来老的接口,可以使用一个新的类,他可以继承原来的老类也可以使用组合使用老类,保证原来的接口继续受到兼容。这就需要我们现在说的适配器模式。简单的理解,适配器就是一个转接头。
这是适配模式的关系图。Adaptee类是被适配的类,Adapter2是适配器类,对类Adaptee进行一定的适配,使得Client类可以调用。假设Client是我们的手机,Adapter是手机充电线的变压器,Adaptee则是220v电流。经过Adapter的适配,Client可以使用220v的电来进行充电。看一下代码:
1 public interface Target { 2 public void doHandle(); 3 } 4 5 Target的实现类Adapter 6 public class Adapter extends Adaptee implements Target{ 7 8 @Override 9 public void doHandle() { 10 super.requst(); 11 } 12 13 } 14 15 public class Adaptee { 16 public void requst() { 17 System.out.println("执行了方法"); 18 } 19 } 20 21 public class Client { 22 public void test(Target t){ 23 t.doHandle(); 24 } 25 public static void main(String[] args) { 26 Client c = new Client(); 27 Target t = new Adapter(); 28 c.test(t); 29 } 30 }
上面是使用继承来实现的,下面将Adapter类和Client类稍加修改,使用组合实现适配器模式:
1 public class Adapter2 implements Target{ 2 3 Adaptee adaptee; 4 5 public Adapter2(Adaptee adaptee) { 6 super(); 7 this.adaptee = adaptee; 8 } 9 10 @Override 11 public void doHandle() { 12 adaptee.requst(); 13 } 14 15 } 16 17 public class Client2 { 18 public void test(Target t){ 19 t.doHandle(); 20 } 21 public static void main(String[] args) { 22 Client2 c = new Client2(); 23 Adaptee adaptee = new Adaptee(); 24 Target t = new Adapter2(adaptee); 25 c.test(t); 26 } 27 }
只改变了这两个类,其他类不需要改变。
因为java是单继承的,继承了Adaptee类之后,就没有办法集成其他类,因此建议使用组合的适配器模式。