【Java 设计模式】接口型模式--Adapter(适配器)模式

Java适配器模式详解

【Java 设计模式】接口型模式–Adapter(适配器)模式

Adapter模式的宗旨就是:向客户提供接口,并使用现有的类所提供的服务,以满足客户的需求。
或者说,现在有class A的方法满足客户的部分要求,将另一部分需求抽象为interface B,那么就要有Adapter来使得class A和interface B相互结合,满足客户全部需求。

通俗的理解:在party上,我想去搭讪一个女生Jerry。但是我的英语很烂,于是我拿了个翻译器,翻译器就是我和Jerry之间的Adapter,让我和Jerry可以很好的交谈。

一,类适配器
这里写图片描述

示例代码

public interface RequiredInterface { 
    /**
     * 这是客户需要的方法
     */
    public void requireMethod(); 
}
public class ExistingClass {
    /**
     * 这是现有的方法
     */    
    public void usefulMethod(){}

}

 适配器角色Adapter扩展了ExistingClass ,同时又实现了RequiredInterface 接口。由于ExistingClass 没有提供requireMethod()方法,而RequiredInterface 又要求这个方法,因此适配器角色Adapter实现了这个方法。

public class Adapter extends ExistingClass implements RequiredInterface {
    /**
     * 由于源类ExistingClass没有方法requireMethod()
     * 因此适配器补充上这个方法
     */
    @Override
    public void requireMethod() {
        //写相关的代码
    }
}

二,对象适配器
类适配器通过创建子类来实现适配,在设计类适配器的时候,新的适配器类可以实现期望的接口,并扩展已有的类。而对象适配器则是用委托的方式。
有两种方式,一种是实现接口的方式,一种是继承类的方式。
实现目标接口
这里写图片描述
示例代码

public interface RequiredInterface { 
    /**
     * 这是客户需要的方法
     */
    public void requireMethod(); 
}
public class ExistingClass {
    /**
     * 这是现有的方法
     */    
    public void usefulMethod(){}

}
public class Adapter implements RequiredInterface{
    private ExistingClass exist;

    public Adapter(ExistingClass exist){
        this.exist = exist;
    }
    /**
     * 源类ExistingClass有方法usefulMethod
     * 因此适配器类直接委派即可
     */
    public void usefulMethod(){
        this.exist.usefulMethod();
    }
   /**
     * 由于源类ExistingClass没有方法requireMethod()
     * 因此适配器补充上这个方法
     */
    @Override
    public void requireMethod() {
        //写相关的代码
    }
}

继承目标类
这里写图片描述
示例代码

public class RequiredClass { 
    /**
     * 这是客户需要的方法
     */
    public void requireMethod(); 
}
public class ExistingClass {
    /**
     * 这是现有的方法
     */    
    public void usefulMethod(){}

}
public class Adapter extends RequiredClass {
    private ExistingClass exist;

    public Adapter(ExistingClass exist){
        this.exist = exist;
    }
    /**
     * 源类ExistingClass有方法usefulMethod
     * 因此适配器类直接委派即可
     */
    public void usefulMethod(){
        this.exist.usefulMethod();
    }
   /**
     * 由于源类ExistingClass没有方法requireMethod()
     * 因此适配器补充上这个方法
     */
    public void requireMethod() {
        //写相关的代码
    }
}

三,接口的适配器模式
接口的适配器是这样的:有时我们写的一个接口中有多个抽象方法,当我们写该接口的实现类时,必须实现该接口的所有方法,这明显有时比较浪费,因为并不是所有的方法都是我们需要的,有时只需要某一些,
此处为了解决这个问题,我们引入了接口的适配器模式,借助于一个抽象类,该抽象类实现了该接口,实现了所有的方法,而我们不和原始的接口打交道,只和该抽象类取得联系,所以我们写一个类,继承该抽象类,重写我们需要的方法就行。
这里写图片描述

示例代码

public interface RequiredInterface{  

    public void requireMethod1();  
    public void requireMethod2();  
}  
public abstract class AbstractRequiredClass implements RequiredInterface{  

    public void requireMethod1(){}  
    public void requireMethod2(){}  
} 
public class Adapter1 extends AbstractRequiredClass {  
    public void requireMethod1(){  
        System.out.println("the RequiredInterface interface's first requireMethod1!");  
    }  
}  
public class Adapter2 extends AbstractRequiredClass {  
    public void requireMethod2(){  
        System.out.println("the RequiredInterface interface's first requireMethod2!");  
    }  
}  

个人觉得适配器模式中的这三种模式是挺灵活的,比如:复用性,系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。还有扩展性在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。
不过在使用适配器时,也要注意到除非对系统的架构很清楚,否则过多的使用适配器,会让系统非常零乱,不易整体进行把握。

参考:
《Design Pattern in Java》. Steven John Metsker , William C.Wake
博客:http://blog.youkuaiyun.com/doymm2008/article/details/13288067

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值