当前位置: 首页 > article >正文

第八章 适配器模式


文章目录

  • 前言
  • 一、类适配器模式
    • 完整代码
    • 220V 被适配类 Voltage220V
    • 5V 适配接口 IVoltage5V
    • 适配器类转换电压 VoltageAdapter 继承220V实现5V接口
    • 手机类判断是否能充电 Phone
    • 客户端调试
    • 类适配器模式注意事项和细节
  • 二、对象适配器模式
    • 完整代码
    • 220V 被适配类 Voltage220V
    • 5V 适配接口 IVoltage5V
    • 适配器类转换电压 VoltageAdapter 聚合 220V实现5V接口
    • 手机类判断是否能充电 Phone
    • 客户端调试
    • 对象适配器模式注意事项和细节
  • 三、接口适配器模式
    • 完整代码
    • 接口
    • 抽象类
    • 客户端测试
  • 四、适配器模式在SpringMVC框架应用的源码分析
    • 模拟SpringMVC 的 DispatchServlet 的执行流程,使用适配器模式
    • 完整代码
    • 适配器接口与被适配类(适配器角色与 被适配角色)
    • 多种Controller实现, 目标角色
    • DispatchServlet
  • 五、适配器模式的注意事项和细节


前言

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


一、类适配器模式

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

完整代码

220V 被适配类 Voltage220V

package tanchishell.SJMS.classadapter;

//被适配的类
public class Voltage220V {

    //输出 220V 的电压
    public int output220V() {
        int src = 220;
        System.out.println("电压=" + src + "伏");
        return src;
    }
}

5V 适配接口 IVoltage5V

package tanchishell.SJMS.classadapter;

//适配接口
public interface IVoltage5V {
    public int output5V();
}

适配器类转换电压 VoltageAdapter 继承220V实现5V接口

package tanchishell.SJMS.classadapter;

//适配器类
public class VoltageAdapter extends Voltage220V implements IVoltage5V {
    @Override
    public int output5V() {
        //获取到 220V 电压
        int srcV = output220V();
        int dstV = srcV / 44 ; //转成 5v
        return dstV;
    }
}

手机类判断是否能充电 Phone

package tanchishell.SJMS.classadapter;

public class Phone {
    //充电
    public void charging(IVoltage5V iVoltage5V) {
        if(iVoltage5V.output5V() == 5) {
            System.out.println("电压为 5V, 可以充电~~");
        } else if (iVoltage5V.output5V() > 5) {
            System.out.println("电压大于 5V, 不能充电~~");
        }
    }
}

客户端调试

package tanchishell.SJMS.classadapter;

public class Client {
    public static void main(String[] args) {
        System.out.println(" === 类适配器模式 ====");
        Phone phone = new Phone();
        phone.charging(new VoltageAdapter());

    }
}

输出

 === 类适配器模式 ====
电压=220伏
电压为 5V, 可以充电~~

类适配器模式注意事项和细节

在这里插入图片描述

二、对象适配器模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

完整代码

220V 被适配类 Voltage220V

package tanchishell.SJMS.classadapter;

//被适配的类
public class Voltage220V {

    //输出 220V 的电压
    public int output220V() {
        int src = 220;
        System.out.println("电压=" + src + "伏");
        return src;
    }
}

5V 适配接口 IVoltage5V

package tanchishell.SJMS.classadapter;

//适配接口
public interface IVoltage5V {
    public int output5V();
}

适配器类转换电压 VoltageAdapter 聚合 220V实现5V接口

package tanchishell.SJMS.classadapter;

//适配器类
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;
    }
}

手机类判断是否能充电 Phone

package tanchishell.SJMS.classadapter;

public class Phone {
    //充电
    public void charging(IVoltage5V iVoltage5V) {
        if(iVoltage5V.output5V() == 5) {
            System.out.println("电压为 5V, 可以充电~~");
        } else if (iVoltage5V.output5V() > 5) {
            System.out.println("电压大于 5V, 不能充电~~");
        }
    }
}

客户端调试

package tanchishell.SJMS.classadapter;

public class Client {
    public static void main(String[] args) {
        System.out.println(" === 对象适配器模式 ====");
        Phone phone = new Phone();
        phone.charging(new VoltageAdapter(new Voltage220V()));

    }
}

输出

 === 对象适配器模式 ====
电压=220伏
使用对象适配器,进行适配~~
适配完成,输出的电压为=5
电压为 5V, 可以充电~~

对象适配器模式注意事项和细节

在这里插入图片描述

三、接口适配器模式

让一个抽象类去实现所有需要的接口,但只实现,不写方法内容,最后需要哪些接口的功能,重写抽象类对应的方法就可以

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

完整代码

接口

package tanchishell.SJMS.classadapter2;

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

抽象类

package tanchishell.SJMS.classadapter2;

public class AbsAdapter implements Interface4{
    //默认实现,不写方法体
    @Override
    public void m1() {

    }

    @Override
    public void m2() {

    }

    @Override
    public void m3() {

    }

    @Override
    public void m4() {

    }
}

客户端测试

package tanchishell.SJMS.classadapter2;

public class Client {
    public static void main(String[] args) {
        AbsAdapter absAdapter = new AbsAdapter() {
            //只需要去覆盖我们 需要使用 接口方法
            @Override
            public void m1() {
                System.out.println("使用了 m1 的方法");
            }
        };
        absAdapter.m1();
    }
}

输出

使用了 m1 的方法



四、适配器模式在SpringMVC框架应用的源码分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

模拟SpringMVC 的 DispatchServlet 的执行流程,使用适配器模式

在这里插入图片描述

完整代码

/**
* 思路分析:
* 目标角色 Controller 有着多种实现子类,一一对应对应着 适配器角色 HandlerAdapter的实现子类,被适配角色。
* 当 DispatchServlet.doDispatch()方法被调用时,会先获取一个 目标角色的实现子类 比如 HttpController,
* 这时 调用getController 方法, 去匹配对应的适配器(适配器角色的实现子类被适配角色),当匹配到了对应的适配器,
* 将适配器进行返回,获取到适配器后 调用 handle 方法传入一个Controller,
* 对应的适配器会将传入的Controller进行对应的强制类型转换,再执行适配器里面的 doHttpHandler方法。
*/

适配器接口与被适配类(适配器角色与 被适配角色)

package tanchishell.springMVC;

///定义一个Adapter接口 适配器角色
public interface HandlerAdapter {
    public boolean supports(Object handler);

    public void handle(Object handler);
}

// 多种适配器类  被适配角色

class SimpleHandlerAdapter implements HandlerAdapter {

    public void handle(Object handler) {
        ((SimpleController) handler).doSimplerHandler();
    }

    public boolean supports(Object handler) {
        return (handler instanceof SimpleController);
    }

}

class HttpHandlerAdapter implements HandlerAdapter {

    public void handle(Object handler) {
        ((HttpController) handler).doHttpHandler();
    }

    public boolean supports(Object handler) {
        return (handler instanceof HttpController);
    }

}

class AnnotationHandlerAdapter implements HandlerAdapter {

    public void handle(Object handler) {
        ((AnnotationController) handler).doAnnotationHandler();
    }

    public boolean supports(Object handler) {

        return (handler instanceof AnnotationController);
    }

}

多种Controller实现, 目标角色

package tanchishell.springMVC;

//多种Controller实现, 目标角色
public interface Controller {

}

class HttpController implements Controller {
    public void doHttpHandler() {
        System.out.println("http...");
    }
}

class SimpleController implements Controller {
    public void doSimplerHandler() {
        System.out.println("simple...");
    }
}

class AnnotationController implements Controller {
    public void doAnnotationHandler() {
        System.out.println("annotation...");
    }
}

DispatchServlet

package tanchishell.springMVC;

import java.util.ArrayList;
import java.util.List;

public class DispatchServlet {

    public static List<HandlerAdapter> handlerAdapters = new ArrayList<HandlerAdapter>();

    public DispatchServlet() {
        handlerAdapters.add(new AnnotationHandlerAdapter());
        handlerAdapters.add(new HttpHandlerAdapter());
        handlerAdapters.add(new SimpleHandlerAdapter());
    }

    public void doDispatch() {

        // 此处模拟SpringMVC从request取handler的对象,
        // 适配器可以获取到希望的Controller
        HttpController controller = new HttpController();
        // AnnotationController controller = new AnnotationController();
        //SimpleController controller = new SimpleController();
        // 得到对应适配器
        HandlerAdapter adapter = getHandler(controller);
        // 通过适配器执行对应的controller对应方法
        adapter.handle(controller);

    }

    public HandlerAdapter getHandler(Controller controller) {
        //遍历:根据得到的controller(handler), 返回对应适配器
        for (HandlerAdapter adapter : this.handlerAdapters) {
            if (adapter.supports(controller)) {
                return adapter;
            }
        }
        return null;
    }

    public static void main(String[] args) {
        new DispatchServlet().doDispatch(); // http...
    }


    /**
     *  思路分析:
     *      目标角色 Controller 有着多种实现子类,一一对应对应着 适配器角色 HandlerAdapter的实现子类,被适配角色。
     *      当 DispatchServlet.doDispatch()方法被调用时,会先获取一个 目标角色的实现子类 比如 HttpController,
     *      这时 调用getController 方法, 去匹配对应的适配器(适配器角色的实现子类被适配角色),当匹配到了对应的适配器,
     *      将适配器进行返回,获取到适配器后 调用 handle 方法传入一个Controller,
     *      对应的适配器会将传入的Controller进行对应的强制类型转换,再执行适配器里面的 doHttpHandler方法。
     */

}

五、适配器模式的注意事项和细节

在这里插入图片描述


http://www.kler.cn/a/13599.html

相关文章:

  • 在线题库整理及一些刷题注意事项
  • 好家伙,阿里新产Java性能优化(终极版),涵盖性能优化所有操作
  • TryHackMe-Fusion Corp(ez Windows域渗透)
  • 扩散模型的Prompt指南:如何编写一个明确提示
  • javascript中的装饰器是什么?如何使用?
  • 我国采矿采石设备制造行业发展现状与部分产品市场分析
  • 更新整理了一大波热门免费可用的API大全
  • 二叉树OJ题(C++实现)
  • 《Java集合》ConcurrentSkipListMap
  • toRef
  • Flutter Android问题记录 - 升级Android Studio 2022.2.1版本后运行项目报错
  • CS call结束从GWT fast return to NR流程介绍
  • CSS基础——盒子模型
  • 40岁以上的程序员还容易找到工作吗?聊聊我自己的亲身经历
  • Android MediaCodec dump MP4实践小结
  • UEFI Driver Services
  • 数据集合注入
  • Prometheus和Alertmanager
  • HTML5 Input 类型
  • GitHub 创建 Pull Request 将代码提交至别人的仓库