适配器模式(Adapter Pattern)

将某个类的接口转换成客户端期望的另一个接口表示,目的是兼容性,让原本因为接口不匹配不能一起工作的俩个类可以协同工作,别名(Wrapper)

分为三类:类适配器,对象适配器,接口适配器

工作原理

适配器模式:将一个类的接口转换成另一种接口。让原本接口不兼容的类可以兼容
image.png
image.png

类适配器

介绍:Adapter类 通过继承src类,实现dst基类接口 完成src—.dst的适配

举例:充电器本身相当与Adapter, 220v交流电相当于src(被适配者),dst(目标)是5V直流电

image.png

adapter 继承 src(220V) 实现 5V(interface)

  1. public static void main(String[] args) {
  2. // TODO Auto-generated method stub
  3. System.out.println(" === 类适配器模式 ====");
  4. Phone phone = new Phone();
  5. phone.charging(new VoltageAdapter());
  6. }
  1. //适配接口
  2. public interface IVoltage5V {
  3. public int output5V();
  4. }
  5. //被适配类
  6. public class Voltage220V {
  7. //输出220V电压
  8. public int output220V() {
  9. int src = 220;
  10. System.out.println("v=" + src + "v");
  11. return src;
  12. }
  13. }
  14. //适配器类
  15. public class VoltageAdapter extends Voltage220V implements IVoltage5V {
  16. @Override
  17. public int output5V() {
  18. // TODO Auto-generated method stub
  19. //获取到220V电压
  20. int srcV = output220V();
  21. int dstV = srcV / 44 ; //转成 5v
  22. return dstV;
  23. }
  24. }
  25. public class Phone {
  26. //充电
  27. public void charging(IVoltage5V iVoltage5V) {
  28. if(iVoltage5V.output5V() == 5) {
  29. System.out.println("电压为5V, 可以充电~~");
  30. } else if (iVoltage5V.output5V() > 5) {
  31. System.out.println("电压大于5V, 不能充电~~");
  32. }
  33. }
  34. }

类适配器注意事项

  1. 类适配器需要继承src类,(因为是继承所有已缺点),要求dst必须是接口,有一定的局限性
  2. src类的方法在Adapter中会暴露出来,增加了使用成本
  3. 继承了src类,所以他可以根据需求重写src类的方法,是的Adapter的类活性更强了

    对象适配器

    对象适配器介绍

    基本和类适配器相同,只是将Adapter类修改,不在继承src,而是持有src类的实例,以解决兼容性问题:持有src,现实dst

根据合成复用原则,系统中劲量使用关联关系来替代继承关系

//适配器类
public class VoltageAdapter  implements IVoltage5V {

    private Voltage220V voltage220V; // 关联关系-聚合


    //通过构造器,传入一个 Voltage220V 实例
    public VoltageAdapter(Voltage220V voltage220v) {

        this.voltage220V = voltage220v;
    }



    @Override
    public int output5V() {

        int dst = 0;
        if(null != voltage220V) {
            int src = voltage220V.output220V();//获取220V 电压
            System.out.println("使用对象适配器,进行适配~~");
            dst = src / 44;
            System.out.println("适配完成,输出的电压为=" + dst);
        }

        return dst;

    }

}
public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println(" === 对象适配器模式 ====");
        Phone phone = new Phone();
        phone.charging(new VoltageAdapter(new Voltage220V()));
    }

接口适配器

接口适配器模式(默认,缺省适配器模式)
当不需要全部实现接口提供的方法的时候,可以设计一个抽象类的实现接口,并为该接口中每个方法那么抽象类的子类可有限制的覆盖父类的默写方法。

public interface Interface4 {
    public void m1();
    public void m2();
    public void m3();
    public void m4();
}

//在AbsAdapter 我们将 Interface4 的方法进行默认实现
public abstract class AbsAdapter implements Interface4 {

    //默认实现
    public void m1() {

    }

    public void m2() {

    }

    public void m3() {

    }

    public void m4() {

    }
}



public static void main(String[] args) {

        AbsAdapter absAdapter = new AbsAdapter() {
            //只需要去覆盖我们 需要使用 接口方法
            @Override
            public void m1() {
                // TODO Auto-generated method stub
                System.out.println("使用了m1的方法");
            }
        };

        absAdapter.m1();
    }

适配器注意事项

三种命名方法,是根据src是以什么样的形式给adapter来区分的

类适配器:以类给到Adapter,将src当成类 继承
对象适配器:以对象给到Adapter,将src当成一个对象 持有
接口适配器:以接口给到Adapter,将src作为一个接口,实现

adapter模式最大的作用是将原本不兼容的接口融合在一起工作