左图是:对象结构型适配器模式;右图是:类结构型适配器模式。常用的是第一种方式。
对象结构型适配器模式与代理模式的UML类图比较接近,对比的看一下:
左图是:对象结构型适配器模式;右图是:代理模式。适配器模式,可以看作是简化的代理模式,Adaptee无需实现Target接口。
适配器模式的本质就是:A类想调用B类中的一个方法,现在用抽象的接口C将A与B隔离开,改为A调用C,而C再调用B。
这样B的变化就不会影响到A,也就说C将B的变化隔离开了。
适配器模式(Adapter)定义:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
适配器模式的优点有:
1、客户端通过适配器可以透明地调用目标接口。
2、复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类。
3、将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。
目标对象(被适配的对象):
1 public class Adaptee { 2 public void specificRequest() { 3 System.out.println("原组件执行"); 4 } 5 }
对象结构适配器:
1 public interface Target { 2 public void request(); 3 } 4 5 public class Adapter implements Target { 6 private Adaptee adaptee; 7 8 public Adapter(Adaptee adaptee) { 9 this.adaptee = adaptee; 10 } 11 12 @Override 13 public void request() { 14 // TODO Auto-generated method stub 15 adaptee.specificRequest(); 16 } 17 }
类结构适配器:
1 public class ClassAdapter extends Adaptee implements Target { 2 @Override 3 public void request() { 4 // TODO Auto-generated method stub 5 specificRequest(); 6 } 7 }
调用方式:
1 public class Client { 2 public static void main(String[] args) { 3 //类适配器 4 Target target = new ClassAdapter(); 5 target.request(); 6 7 System.out.println("----------------"); 8 //被调用的目标对象 9 Adaptee adaptee = new Adaptee(); 10 11 //适配器,左侧和右侧分别是两个“螺丝扣” 12 Target adapter = new Adapter(adaptee); 13 14 //信息通过adapter传输 15 adapter.request(); 16 } 17 }
执行结果:
通过调用适配器(Adapter)的request()方法,完成了对被适配对象(Adaptee)的specificRequest()方法的执行。
假如Adaptee中的逻辑修改了,比如specificRequest()的方法签名改了,内部逻辑改了,都不会影响Client中的代码。