职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 1796|回复: 1

适配器模式

[复制链接]
郁闷小男人 发表于 2011-9-5 10:59 | 显示全部楼层 |阅读模式
        将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。  --- 《设计模式》GOF

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

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

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

        适配器的UML图:



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

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

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

class Adapter extends Adaptee implements Target{}

       假设现在Target的内容为:
  
interface operation {   
      public int add(int a , int b);      
}  

interface operation {
      public int add(int a , int b);   
}

Adaptee的内容为:
        
public class Adaptee{   
    public int addOpe(int a ,int b){   
         return a+b;   
    }   
}  

public class Adaptee{
    public int addOpe(int a ,int b){
         return a+b;
    }
}

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

  
public class Adapter extends Adaptee implements Target{   
     public int add(int a , int b) {   
        addOpe(a,b);   
     }   
}  

public class Adapter extends Adaptee implements Target{
     public int add(int a , int b) {
        addOpe(a,b);
     }
}


对象适配器:

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

  
class Target{   
    public int add(int a , int b){}   
}  

class Target{
    public int add(int a , int b){}
}

  
Public class Adapter extends Target{   
  
    Adaptee adaptee;   
  
    Adapter(Adaptee adaptee){   
       this.adaptee = adaptee ;   
    }   
  
    public int add(int a,int b){   
       adaptee.addOpe(a,b);   
    }   
}  

Public class Adapter extends Target{

    Adaptee adaptee;

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

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


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

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




broken 发表于 2011-9-5 10:59 | 显示全部楼层
推荐链接
20-30万急聘多名天才Java/MTA软件工程师
见证又一个准百万富翁的诞生!

3G培训就业月薪平均7K+,不3K就业不花一分钱!

您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-4-30 18:17 , Processed in 0.121141 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表