【23种设计模式专题】 五 适配器模式

程序猿学社的GitHub,欢迎Star
github技术专题
本文已记录到github

前言

到目前为止,创建型模式,我们已经知道是怎么一回事咯,从今天开始结构型模式的适配器模式相关学习。

结构型模式作用?

  • 实现松耦合,从而可以扩大整体类结构,用来解决更大的问题

什么是适配器模式?

  • 将一个类的接口转换成客户希望的另外一个接口。解决兼容性的问题,让原本因为不兼容不能一起工作的两个类可以一起工作。

工作原理

待适配的类:适配的类或者接口,定义待适配的接口
适配器:调用是适配的类,转为客户期望的类,解决兼容问题
目标:客户希望的接口或者类

场景案例

  • CAN转USB接口
  • 三口插座转为二口-转换插头
  • usb网线转换器(主要是针对超薄本),无网线插头,可通过转换器实现
  • 例如我们找工作,其实也是一个适配的过程,对照工作要求进行适配。

    隔壁老王: “社长,你这说的都是啥,说的我一脸懵逼的,能否详细说说”
    社长: “老王,刚刚我们已经知道适配器的概念和场景,你听着有点懵逼正常,那是因为刚刚都是停留在理论阶段,没有跟生活更好的结合起来,为了方便理解,我画了一个图”

实战

类适配器

网线

package com.cxyxs.designmode.adapter;

/**
 * Description:网线
 * Author: 程序猿学社
 * Date:  2020/5/16 23:50
 * Modified By:
 */
public class Reticle {
    public  void Internet(){
        System.out.println("插上网线,开始网上冲浪。。。");
    }
}

USB适配接口

package com.cxyxs.designmode.adapter;

/**
 * Description:USB适配接口
 * Author: 程序猿学社
 * Date:  2020/5/17 0:22
 * Modified By:
 */
public interface Usb {
    public void conversion();
}
  • 处理上网的请求

适配器

package com.cxyxs.designmode.adapter;

/**
 * Description:适配器
 * Author: 程序猿学社
 * Date:  2020/5/16 23:55
 * Modified By:
 */
public class UsbAdapter extends Reticle implements  Usb{


    @Override
    public void conversion() {
        super.Internet();
    }
}
  • 等价于USB转接器

电脑

package com.cxyxs.designmode.adapter;

/**
 * Description:超薄电脑
 * Author: 程序猿学社
 * Date:  2020/5/16 23:52
 * Modified By:
 */
public class UltraThinPc {
    /**
     * 网上冲浪
     * @param usb
     */
    public void surfing(Usb usb){
        usb.conversion();
    };
}

隔壁老王: “买了一台电脑,只有USB接口,我们需要上网咋办?”
社长: “我们需要买一个USB网线转换器,就可以实现上网功能,所以这里需要聚合一个USB的接口,这样就可以实现上网功能”

测试类

package com.cxyxs.designmode.adapter;

/**
 * Description:
 * Author: 程序猿学社
 * Date:  2020/5/17 0:02
 * Modified By:
 */
public class Client {
    public static void main(String[] args) {
        UsbAdapter usb = new UsbAdapter();
        UltraThinPc ultraThinPc = new UltraThinPc();
        ultraThinPc.surfing(usb);
    }
}


社长: “说了这么多,我们来总结一下类适配器”

类适配器缺点:

  • 类适配器(UsbAdapter)使用了单继承(Reticle网线),会有局限性。

隔壁老王: “既然,类适配器存在单继承的问题,有没有版本去改进”
社长: “有办法的,我们可以采用对象适配器的方式”

对象适配器

对象适配器

package com.cxyxs.designmode.adapter.newclass;

import com.cxyxs.designmode.adapter.Reticle;
import com.cxyxs.designmode.adapter.Usb;

/**
 * Description:适配器
 * Author: 程序猿学社
 * Date:  2020/5/16 23:55
 * Modified By:
 */
public class UsbNewAdapter  implements  Usb{
    private Reticle reticle;

    public  UsbNewAdapter(Reticle reticle) {
        this.reticle = reticle;
    }

    @Override
    public void conversion() {
        reticle.Internet();
    }
}
  • 把继承换成聚合,解决了单继承的问题

客户端

package com.cxyxs.designmode.adapter.newclass;

import com.cxyxs.designmode.adapter.Reticle;
import com.cxyxs.designmode.adapter.UltraThinPc;
import com.cxyxs.designmode.adapter.UsbAdapter;

/**
 * Description:
 * Author: 程序猿学社
 * Date:  2020/5/17 0:02
 * Modified By:
 */
public class NewClient {
    public static void main(String[] args) {
        //网线
        Reticle reticle = new Reticle();
        UsbNewAdapter usb = new UsbNewAdapter(reticle);
        UltraThinPc ultraThinPc = new UltraThinPc();
        ultraThinPc.surfing(usb);
    }
}


作者:程序猿学社
原创公众号:『程序猿学社』,专注于java技术栈,分享java各个技术系列专题,以及各个技术点的面试题。
原创不易,转载请注明来源(注明:来源于公众号:程序猿学社, 作者:程序猿学社)。

©️2020 CSDN 皮肤主题: 程序猿惹谁了 设计师: 上身试试 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值