左图是:对象结构型适配器模式;右图是:类结构型适配器模式。常用的是第一种方式。

 

对象结构型适配器模式与代理模式的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中的代码。

posted on 2019-12-28 11:05  Sempron2800+  阅读(109)  评论(0编辑  收藏  举报