专栏首页行者常至适配器模式(Adapter Class/Object)

适配器模式(Adapter Class/Object)

适配器模式(Adapter Class/Object)

是指将一个接口转换成客户端希望的另外一个接口,该模式使得原本不兼容的类可以一起工作。

举个例子:macbook pro有一个HDMI接口,一条HDMI接口的数据线,现在要外接显示器,而显示器只有VGI接口,我们需要一个HDMI-VGI转换器,这个转换器其实起到的作用就是适配器,让两个不兼容的接口可以一起工作。

类图:

适配器有4种角色:

  • 1.目标抽象角色(Target):定义客户所期待的使用接口。(GVI接口)
  • 2.源角色(Adaptee):需要被适配的接口。(HDMI接口)
  • 3.适配器角色(Adapter):把源接口转换成符合要求的目标接口的设备。(HDMI-VGI转换器)
  • 4.客户端(client):例子中指的VGI接口显示器。

把HDMI接口转换成VGI接口,使得macbook pro可以外接显示器。

//HDMI接口,需要被适配的接口
public interface HDMIPort {
    void workByHDMI();
}
//VGI接口,客户端所期待的接口
public interface VGIPort {
    void workByVGI();
}
//将HDMI接口转换为VGI,这就是适配器
public class HDMIToVGI implements VGIPort{

    HDMIPort hdmiPort;

    public HDMIToVGI(HDMIPort hdmiPort) {
        this.hdmiPort = hdmiPort;
    }
    //将HDMI接口转换为VGI接口
    @Override
    public void workByVGI() {
        hdmiPort.workByHDMI();
    }
}
public static void main(String[] args) {
        //定义一个HDMI接口
        HDMIPort hdmiPort = new HDMIPort() {
            @Override
            public void workByHDMI() {
                //hdmi接口工作方式
            }
        };
        //将HDMI接口转换为VGI接口
        VGIPort vgiPort = new HDMIToVGI(hdmiPort);
        //经过转换HDMI接口变成了VGI接口
        vgiPort.workByVGI();
    }

总结

适配器模式优点:

  • 1.可以让任何两个没有关联的类一起运行。
  • 2.提高了类的复用。
  • 3.增加了类的透明度。
  • 4.灵活性好。

适配器模式缺点:过多地使用适配器,会让系统非常零乱,不易整体进行把握。

适用场景:

  • 1.系统需要使用现有的类,而此类的接口不符合系统的需要。
  • 2.想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。
  • 3.通过接口转换,将一个类插入另一个类系中。

Test

package com.qbz.test;

//MicroUSB接口,客户端所期待的接口
interface MicroUSB {
    void process();
}

// USBTypec接口,需要被适配的接口
interface USBTypec {
    void process();
}

class Phone implements MicroUSB {
    @Override
    public void process() {
        System.out.println("使用MicroUSB接口进行充电");
    }
}

class Car implements USBTypec {
    @Override
    public void process() {
        System.out.println("使用USBTypec接口进行充电");
    }
}

// 适配器,将USBTypec接口转换成MicroUSB
class USBTypecToMicroUSB implements MicroUSB {

    USBTypec usbTypec;

    public USBTypecToMicroUSB(USBTypec usbTypec) {
        this.usbTypec = usbTypec;
    }

    @Override
    public void process() {
        System.out.println("USBTypec接口转换成MicroUSB");
        // 将USBTypec接口转换成MicroUSB接口
        usbTypec.process();
    }
}

public class Main {

    public static void main(String[] args) {
        USBTypec usbTypec = new Car();
        USBTypecToMicroUSB tTom = new USBTypecToMicroUSB(usbTypec);
        tTom.process();
    }

}

输出:

USBTypec接口转换成MicroUSB
使用USBTypec接口进行充电

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 012.golang 接口interface

    qubianzhong
  • 011.golang 方法 method

    qubianzhong
  • java发送http的get、post请求

    转载自 http://www.cnblogs.com/zhuawang/archive/2012/12/08/2809380.html

    qubianzhong
  • 接口配置有效管理(获取配置文件内容3种常见方式)

    问:我们项目现在就是配置在yml中的,但是有很多外部接口,配置文件中看起来很乱,有时候修改还修改错了

    肖哥哥
  • 一文搞定Postman接口自动化测试

    本文适合已经掌握 Postman 基本用法的读者,即对接口相关概念有一定了解、已经会使用 Postman 进行模拟请求等基本操作。

    lyb-geek
  • Jtro的技术分享:c#的接口使用

    接口的特征: 1.接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员 2.不能直接实例化接口 3.接口可以包含时间事件、索引器、方法和属...

    LittleU
  • 数据结构与算法2016-06-03

    一个算法调用自己来完成它的部分工作,在解决某些问题时,一个算法需要调用自身。如果一个算法直接调用自己或间接调用自己,就称这个算法是递归的。根据调用方式的不同,它...

  • 微信JSSDK那些事

    好长时间没对微信的H5进行开发,不过感觉微信基本已经废弃了JSSDK的更新,把更多的精力向小程序那边转移。不过刚好要维护一个以前写的微信H5所以重新拿了起来,如...

    谭广健
  • 接口工具分析

    系统对外的接口:比如你要从别的网站或服务器上获取资源或信息,别人肯定不会把 数据库共享给你,他只能给你提供一个他们写好的方法来获取数据,你引用他提供的接口就能使...

    用户7880705
  • 我所理解的接口设计

    自己做接口开发的时间也算不短了(三年),想写这篇文章其实差不多已经有一年多的时间了。我将从下面的方向来对我所理解的接口设计做个总结:

    用户1093396

扫码关注云+社区

领取腾讯云代金券