`

适配器模式

 
阅读更多

     将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。  --- 《设计模式》GOF

       Adapter模式的宗旨就是,基于现有类所提供的服务,向客户端提供接口,以满足客户的期望。---《java设计模式 》


       对软件系统中,如果要复用以前的“现存对象”,但是这些对象所提供的接口并不一定能适应我们的新环境,我们就要将其转换成我们需要的接口,来供我们调用。Adapter模式通过定义一个新的接口(对要实现的功能加以抽象),和一个实现该接口的Adapter(适配器)类来透明地调用外部组件。这样替换外部组件时,最多只要修改几个Adapter类就可以了,其他源代码都不会受到影响。

        简单理解就是:我们需要实现某个功能,而现在实现这个功能的组件不必我们自己开发,可以通过第三方的组件(即别人的代码或者自己曾经写过的代码)来实现,但第三方组件的接口与现在所定义的接口不一致(即类名,方法名不一样),那么在不修改两方接口的情况下,可以通过采用适配器模式来解决这一问题。

        适配器的UML图:



Target       即客户端给出的接口(此处不是java语言中的接口类型,而是指类名,方法名等等),
                      也就是客户端需要调用的组件。
Adapter     即适配器
Adaptee     即第三方组件

根据Target是否是java接口类型,适配器可以分为类适配器对象适配器

类适配器:
        此时Target是一个java接口,其中定义了其所期望的功能,而此时的Adapter则通过继承Adaptee类并实现Target接口来完成。即
       

Java代码 复制代码 收藏代码
  1. class Adapter extends Adaptee implements Target{}  
class Adapter extends Adaptee implements Target{}


       假设现在Target的内容为:
Java代码 复制代码 收藏代码
  1.  interface operation {   
  2.       public int add(int a , int b);      
  3. }  
 interface operation {
      public int add(int a , int b);   
}


Adaptee的内容为:
     
Java代码 复制代码 收藏代码
  1. public class Adaptee{   
  2.     public int addOpe(int a ,int b){   
  3.          return a+b;   
  4.     }   
  5. }  
public class Adaptee{
    public int addOpe(int a ,int b){
         return a+b;
    }
}


那么为了利用Adaptee类,类适配器Adapter可以写成:

Java代码 复制代码 收藏代码
  1. public class Adapter extends Adaptee implements Target{   
  2.      public int add(int a , int b) {   
  3.         return addOpe(a,b);   
  4.      }   
  5. }  
public class Adapter extends Adaptee implements Target{
     public int add(int a , int b) {
        return addOpe(a,b);
     }
}



对象适配器:

此时Target可能是一个普通类,那么Adapter的实现可以通过继承Target,并将具体实现委托给Adaptee来完成。同样是前面的add例子:

Java代码 复制代码 收藏代码
  1. class Target{   
  2.     public int add(int a , int b){}   
  3. }  
class Target{
    public int add(int a , int b){}
}


Java代码 复制代码 收藏代码
  1. Public class Adapter extends Target{   
  2.   
  3.     Adaptee adaptee;   
  4.   
  5.     Adapter(Adaptee adaptee){   
  6.        this.adaptee = adaptee ;   
  7.     }   
  8.   
  9.     public int add(int a,int b){   
  10.        return adaptee.addOpe(a,b);   
  11.     }   
  12. }  
Public class Adapter extends Target{

    Adaptee adaptee;

    Adapter(Adaptee adaptee){
       this.adaptee = adaptee ;
    }

    public int add(int a,int b){
       return adaptee.addOpe(a,b);
    }
}



总结:个人觉得适配器模式用到了面向对象语言中的多态的特性,根据客户端给出的组件是接口还是类,适配器通过实现接口或者继承类的方式来实现多态。 如果是实现接口,那么适配器则可以继承第三方组件,通过调用父类方法来完成功能。如果是继承,因为java中不支持多继承,适配器将具体操作委派给第三方组件来完成。这是根据客户端给出的组件类型来区分,个人认为即使客户端给出的组件是接口,也可以通过将具体实现委派给第三方组件来完成,因为设计模式的原则是:优先使用对象组合而不是类继承。这样适配器模式就很容易理解,就是客户端通过多态调用适配器,适配器通过使用第三方对象来完成具体功能。

小弟初学设计模式,肯定有理解不太清楚的地方,希望各位不吝指教。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics