设计模式之——适配器模式详解
博客专区 > TedYin 的博客 > 博客详情
设计模式之——适配器模式详解
TedYin 发表于4年前
设计模式之——适配器模式详解
  • 发表于 4年前
  • 阅读 506
  • 收藏 51
  • 点赞 0
  • 评论 1

【腾讯云】新注册用户域名抢购1元起>>>   

这次跟大家分享一下我对适配器模式的理解。

适配器模式的定义:

将一个类的接口转换成用户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的类,可以一起工作了。

举个我们日常生活中的例子: 

有一部移动电源,有一部iphone一部android手机,需要充电使用普通的Usb线就可以给android手机充电,而在给iphone充电的时候必须使用适配iphone的万能转接头才能充电。

iphone和android就相当于两个不兼容的接口,转接头就相当于一个适配器,他使得iphone和android手机都能充电了。

在我们的项目中可以这样是用适配器模式:

加入我们开发一个发说说动态的功能,第一版要求可以发送文字,实现如下:

public interface ISendTextPost{
    public void sendTextPost();
}

public class SendTextPost implements ISendTextPost{
    public void sendTextPost{
        //发送文字动态
    }
}

实现方式如上所述,很简单。如果第二版要求既可以发图片也可以发文字动态,实现如下:

public interface ISendPicturePost{
    public void sendTextPost();
    pubiic void sendPicturePost();
}

    //假如发文字和图片是这样的~~
public class SendPicturePost implements ISendPicturePost{

    public void sendTextPost{
        //发送文字动态
    }

    public void sendPicturePost{
        //发送图片动态
    }
}

上述方法实现是否有问题?肯定是不行的,因为发送文字的方法之前已经实现了,完全没必要再去实现一次。如果重复的方法有很多呢,这样肯定不行了。

对于这种接口不兼容的问题,使用适配器模式可以很好的解决:

适配器模式的模型如下:

/*
* 用户所需功能接口 target1
*/
public interface ITarget1{
    public void doTarget1();
}

//target1实现类
public class Target1Impl implements ITarget1{
    public void doTarget1(){
        //做A事情
    }
}

/*
* 用户所需功能接口 target2
*/
public interface ITarget2{
    public void doTarget2();
}

//target2实现类
public class Target2Imp implements ITarget2{
    public void doTarget2(){
        //做B事情
    }
}

/*
* 适配器
*/
public class Adapter implements ITarget1, ITarget2{
    private ITarget1 target1;
    private ITarget2 target2;
    
    public Adapter(ITarget1 target1,ITarget2 target2){
        this.target1 = target1;
        this.target2 = target2;
    }
    
    public void target1(){
        //做A事情
        target1.doTarget1();
    }
    
    public void doTarget2(){
        //做B事情
        target2.doTarget2();
    }
}

//Client 
public class Client {
    public static void main(Sting[] args){
        ITarget1 target1 = new Target1Impl();
        ITarget2 target2 = new Target1Imp2();
        
        Adapter adapter = new Adapter(target1,target2);
        adapter.doTarget1();
        adapter.doTarget2();
    }
}

上面就是使用适配器的实现方式。在上述的实现方式中,target1和target2都是业务层面的接口,他们有不同的业务功能,对于客户端来说,调用target1接口时很正常,但是要兼容target2的功能的时候,就需要有一个类实现target1 的功能,并且兼容了target2功能的类,Adapter就是这样的一个类,他就是一个转换器,兼容不同的接口来实现功能。

     在上面的实现中,实质上是使用对象组合来实现业务功能的兼容。使用适配器可以使已有功能复用,加快开发效率,减少维护成本,在Adapter中也可以加入一些自己实现的公用方法,这样可以使得Adapter的功能更强大。在一个系统中不应该过多的使用Adapter类,如果不是很有必要则不需要使用,使用过多,会使得系统变得凌乱,不好把握,明明调的是A接口但是返回的是B结果。 

    适配器模式的最重要的一点就是,对象组合,转换匹配,复用功能。







  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 1
博文 20
码字总数 10592
评论 (1)
linsea
总结得很好,可否上个uml?
×
TedYin
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: