java设计模式精讲 Debug 方式+内存分析 第12章 适配器模式

12-1 适配器模式讲解

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


12-2 适配器模式coding

有一个被适配器类:

public class Adaptee {
    public void adapteeRequest() {
        System.out.println("被适配者的方法");
    }
}

这个是目标方法的接口:

public interface Target {
    void request();
}

这个是目标方法的实现:

/** 具体的实现类 */
public class ConcreteTarget implements Target {
    @Override
    public void request() {
        System.out.println("ConcreteTarget目标方法");
    }
}

而这个就是适配类:继承于被适配类,实现目标方法的接口:

public class Adapter extends Adaptee implements Target {
    @Override
    public void request() {
        super.adapteeRequest();
    }
}

我们来进行测试一下:

public class Test {
    public static void main(String[]args){
        Target target = new ConcreteTarget();
        target.request();

        /** 现在,我们就来通过适配器类来进行实现 */
        Target adapterTarget = new Adapter();
        adapterTarget.request();
    }
}

测试结果如下:

ConcreteTarget目标方法
被适配者的方法


这个时候,我们调用适配类里面的方法,然后转到被适配类里面的方法:
在这里插入图片描述
以上的就是类适配器模式;
现在的类图为:
在这里插入图片描述


现在,我们来说说对象适配器模式:
同上面一样:有一个目标接口

public interface Target {
    void request();
}

还有一个具体的目标类:

/** 具体的实现类 */
public class ConcreteTarget implements Target {
    @Override
    public void request() {
        System.out.println("ConcreteTarget目标方法");
    }
}

以及被适配的类:

public class Adaptee {
    public void adapteeRequest() {
        System.out.println("被适配者的方法");
    }
}

适配类和上面的有一些不同,这里被适配类不是继承过来的,而是作为属性组合到里面来,然后通过对象来调用被适配类里面的方法:

public class Adapter implements Target {

    private Adaptee adaptee = new Adaptee();

    @Override
    public void request() {
        adaptee.adapteeRequest();
    }
}

现在,我们来测试一下:我们在拷贝的时候,一定要注意包是否引对

public class Test {
    public static void main(String[]args){
        Target target = new ConcreteTarget();
        target.request();

        /** 现在,我们就来通过适配器类来进行实现 */
        Target adapterTarget = new Adapter();
        adapterTarget.request();
    }
}

执行结果:和上面的类适配器模式的执行结果一样

ConcreteTarget目标方法
被适配者的方法


这个就是现在的类图:
在这里插入图片描述
在继承和组合的时候,我们优先使用组合;


我们再类引入一个生活场景:手机充电器的适配器,将220V的交流电转换成5V的直流电:
首先有一个被适配的类:220V的类

public class AC220 {
    public int outputAC220V() {
        int output = 220;
        System.out.println("输出220V的交流电"+output+"V");
        return output;
    }
}

我们有一个目标方法的接口:转为5V的直流电

public interface DC5 {
    int outputDC5V();
}

这个就是适配类:

public class PowerAdapter implements DC5 {

    private AC220 ac220 = new AC220();

    @Override
    public int outputDC5V() {
        int adapterInput = ac220.outputAC220V();
        /** 变压器 */
        int adapterOutput = adapterInput / 44;
        System.out.println("通过PowerAdapter电源适配器输入AC"+adapterInput+"V"+"输出DC:"+adapterOutput+"V");
        return adapterOutput;
    }
}

public class Test {
    public static void main(String[]args){
        DC5 dc5 = new PowerAdapter();
        dc5.outputDC5V();
    }
}

执行结果:

输出220V的交流电220V
通过PowerAdapter电源适配器输入AC220V输出DC:5V


12-3 适配器模式源码解析(jdk+spring+springjpa+springmvc)

  1. XmlAdapter
  2. AdvisorAdapter
  3. 在JPA里面也大量的使用到适配器模式
  4. HandlerAdapter

猜你喜欢

转载自blog.csdn.net/weixin_37778801/article/details/84671138
今日推荐