设计模式-适配器模式

时间:2022-07-25
本文章向大家介绍设计模式-适配器模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

背景

各国的电压大致分为110V和220V, 一部手机或一部电脑不能直接使用这么高的电压的,需要通过变压器才能直接使用。要不然一插就炸了...

适配器模式是什么?

适配器模式也叫变压器模式,属于结构型模式,用于两个不同的对象互相转换,将原本不能一起工作或各自单个的对象可以一起工作,该模式在实际开发过程中非常常用;

模式可以干什么?

适配器主要用于将两种不同的对象做兼容,起到一个转换的作用。让原本不相干的东西,或不匹配的可以兼容使用。比如电压方面的,美图是110V而中国是220V,原来美国的电器支持不了中国的,电压,一插就挂了。所以通过变压器,将不能兼容的电器用起来。

优点:

  • 提升复用性,并且可以解藕,不影响原有功能,并且减化了实际流程,很好的起到一个解耦作用;
  • 提升拓展性,原来要绕3公里才能到的现在100米就解决了,呵呵;还有一点就是原来的接口不用了,你只需要把这个拓展的功能干掉就可以了,不用去改很多代码,有利用后期维护。

缺点:

  • 对不相干或完全不一样的对象,会导致转换的成本非常高,并且实现过程也异常复杂;
  • 局限性比较高,只能适配专用,而且每兼容一种对象/物品都需要经过特殊处理;

类图

实现代码

/**
 * @Auther: csh
 * @Date: 2020/5/20 17:17
 * @Description:抽象输出接口
 */
public interface IVoltage {
    public int outPutVoltage();
}
/**
 * @Auther: csh
 * @Date: 2020/5/19 17:35
 * @Description:11V电压
 */
public class Voltage110V implements IVoltage{
    private final static int VOLTAGE = 110;

    @Override
    public int outPutVoltage() {
        return VOLTAGE;
    }
}
/**
 * @Auther: csh
 * @Date: 2020/5/19 17:35
 * @Description:220V电压
 */
public class Voltage220V  implements IVoltage{
    private final static int VOLTAGE = 220;

    @Override
    public int outPutVoltage() {
        return VOLTAGE;
    }
}
/**
 * @Auther: csh
 * @Date: 2020/5/20 16:59
 * @Description:5V接口
 */
public interface IOutVoltage5V {
    int outVoltage5V();
}
/**
 * @Auther: csh
 * @Date: 2020/5/20 16:59
 * @Description:12V接口
 */
public interface IOutVoltage12V {
    int outVoltage12V();
}
/**
 * @Auther: csh
 * @Date: 2020/5/20 17:06
 * @Description:手机用5V电压
 */
public class Phone  {

    private int  voltage5v=5;

    void charging(IOutVoltage5V voltage5V){
        //判断用何种充电
        int i = voltage5V.outVoltage5V();
        if(voltage5v == i){
            System.out.println("手机充电中....");
        }else{
            System.out.println("电压不一致......");
        }
    }
}
/**
 * @Auther: csh
 * @Date: 2020/5/20 17:10
 * @Description:
 */
public class Computer {
    private int  voltage12v=12;

    void charging(IOutVoltage12V voltage12V){
        //判断用何种充电
        int i = voltage12V.outVoltage12V();
        if(voltage12v == i){
            System.out.println("电脑正在充电中....");
        }else{
            System.out.println("电压不一致......");
        }
    }
}
/**
 * @Auther: csh
 * @Date: 2020/5/20 17:01
 * @Description:中国适配器
 */
public class ChinaAdapter extends Voltage220V implements IOutVoltage5V, IOutVoltage12V {
    int voltage12V = super.outPutVoltage();
    int voltage5V = super.outPutVoltage();
    @Override
    public int outVoltage12V() {
        System.out.println("将中国的220V转成12V...");
        voltage12V = 12;
        return voltage12V;
    }

    @Override
    public int outVoltage5V() {
        System.out.println("将中国的220V转成5V...");
        voltage5V = 5;
        return voltage5V;
    }
}
/**
 * @Auther: csh
 * @Date: 2020/5/20 17:01
 * @Description:中国适配器
 */
public class AmericaAdapter extends Voltage110V implements IOutVoltage5V, IOutVoltage12V {
    int voltage12V = super.outPutVoltage();
    int voltage5V = super.outPutVoltage();
    @Override
    public int outVoltage12V() {
        System.out.println("将美国的110V转成12V...");
        voltage12V = 12;
        return voltage12V;
    }

    @Override
    public int outVoltage5V() {
        System.out.println("将美国的110V转成5V...");
        voltage5V = 5;
        return voltage5V;
    }
}
/**
 * @Auther: csh
 * @Date: 2020/5/20 15:08
 * @Description:适配器
 */
public class Client {

    public static void main(String[] args) {
        //中国转换器
        //手机充电
        Phone phone = new Phone();
        ChinaAdapter chinaAdapter = new ChinaAdapter();
        phone.charging(chinaAdapter);
        //电脑充电
        Computer computer = new Computer();
        computer.charging(chinaAdapter);
        //美国转换器
        //手机充电
        Phone phone2 = new Phone();
        ChinaAdapter chinaAdapter2 = new ChinaAdapter();
        phone2.charging(chinaAdapter2);
        //电脑充电
        Computer computer2 = new Computer();
        computer2.charging(chinaAdapter2);
        //可以自己再拓展一个整合各个国家的转换器...

    }
}

结果

将中国的220V转成5V...
手机充电中....
将中国的220V转成12V...
电脑正在充电中....
将中国的220V转成5V...
手机充电中....
将中国的220V转成12V...
电脑正在充电中....

最后

其实在各大开源产品中,类似适配器模式是被广泛应用,学习一个模式简单,但是应用好一个模式真的不容易,需要在日常开发过程中广泛应用于实际项目单看没啥用,呵呵!

spring用到适配器如下:

HandlerAdapter

MethodBeforeAdvice

AfterReturningAdvice

ThrowsAdvice

MethodBeforeAdviceInterceptor

AfterReturningAdviceInterceptor

ThrowsAdviceInterceptor