设计模式学习--------5.适配器模式学习

来源:互联网 发布:php url变量 编辑:程序博客网 时间:2024/05/16 18:48

转载:http://blog.csdn.net/krislight/article/details/24122501

 

场景:

       系统升级后,定义了一套新的接口逻辑,但是希望新的接口能兼容旧的功能,比如有些用户没有升级

新版本,还是使用旧的接口和功能.

       类比原来的插头和插孔是两箱的,现在插孔换成或者叫定义成了三箱,这样三箱的插头才可以使用,

来两箱的需要用一个转换器或者叫适配器将两箱转成三箱,这样就可以继续使用.


定义:

      将一个类的接口转换成客户希望的另外一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可

一起工作.


角色:

     Target:新的业务接口

package com.kris.study;

public interface Target {
    public void request();
}

 Adaptee:已经存在的功能,通常能满足客户端要求,但是与新接口的方法定义不一致,需要被适配

package com.kris.study;

public class Adaptee {
   public void oldRequest(String s){
    System.out.println(s);
   }
}

 

 Adapter: 适配器,把Adaptee适配成为Client需要的Target.

package com.kris.study;

public class Adapter implements Target{

 private Adaptee adaptee;
 
 public Adapter(Adaptee adaptee){
  this.adaptee = adaptee;
 }
 
 @Override
 public void request() {
  adaptee.oldRequest("old method invoke");
 }

}

 

Client: 客户端,调用Target接口实现业务

 

package com.kris.study;

public class Client {
   public static void main(String[] args) {
    Adaptee adaptee = new Adaptee();
    Adapter adapter = new Adapter(adaptee);
    adapter.request();
   }
}

原理分析:

       适配器的本质是: 转换匹配,复用功能.

        通过转换调用已有实现,从而能把已有的实现匹配成需要的接口,使之满足新的业务需要,所以转换匹配是手段,复用已有功能才是目的。

        适配器实际上利用了对象组合的方式

        一个适配器可以适配多个Adaptee,也就是实现新的Target接口时需要调用多个不同的模块,也可以缺省实现,简单

的转换接口的参数.复杂度取决于Target和Adaptee的相似程度.

       一个适配器也可以进行双向适配,比如上面的例子同时让新的接口实现类TargetImpl去适配Adaptee接口.


优点:

         更好的复用性,扩展性.

缺点:

         当旧的功能与新的接口功能相似度很低时,使用适配还不如重写方便

         当过多的使用适配器,会导致系统零乱,明明是调用A的接口,实际上却是通过B的接口来实现.这时应该选择重构.

0 0