您的位置:首页 > 其它

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

2020-05-31 18:33 309 查看

程序猿学社的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各个技术系列专题,以及各个技术点的面试题。
    原创不易,转载请注明来源(注明:来源于公众号:程序猿学社, 作者:程序猿学社)。

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: