第八章 适配器模式

news2024/11/17 0:08:21

文章目录

  • 前言
  • 一、类适配器模式
    • 完整代码
    • 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.coloradmin.cn/o/452214.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Go 语言入门很简单:Go 实现简易Web应用

前言 截止到目前为止&#xff0c;几乎我们的 Go 入门文章都是在终端运行的。 在终端运行的代码或者运用运用程序只适合自己在环境搭好的环境下使用。也就是说&#xff0c;如果用户没有安装 Go 语言环境&#xff0c;是根本没法运行我们所写的 Go 代码&#xff0c;普通用户可以…

美女如何零基础学习网络安全???

学习网络安全是一项极具挑战性的技能&#xff0c;大家在自学网络安全时&#xff0c;往往会遇到各种问题&#xff0c;导致迷茫。面对这种情况&#xff0c;解决源头问题是关键。因此&#xff0c;在接下来的探讨中&#xff0c;我们将首先分析学习网络安全的常见问题&#xff0c;并…

初识Spring(普通方式Bean的读取过程)

1.SpringBoot 相⽐于 Servlet 的优点总结 1. 添加外部 jar 更容易&#xff0c;不易出错&#xff08;版本问题⽆需关注&#xff09;&#xff1b; 2. 调试项⽬更加⽅便&#xff0c;⽆需配置 Tomcat&#xff1b; 3. 发布项⽬更加⽅便&#xff0c;⽆需配置 Tomcat&#xff1b; 4. …

【iOS】—— 响应者链和事件传递链

响应者链和事件传递链 文章目录 响应者链和事件传递链二者概念响应者响应链事件UIKit继承图UIResponderUITouchUITouch几个重要属性 UITouch的两个方法&#xff08;可用于view的拖拽&#xff09; UIEventUIEvent几个重要属性 事件的产生与传递传递链传递过程hitTest:withEvent:…

多路归并排序

内部排序和外部排序 内部排序&#xff1a;整个的排序过程都在内存中进行排序 外部排序&#xff1a;对大文件进行排序&#xff0c;无法将整个需要排序的文件复制到内存&#xff0c;所以会把文件存储到外村&#xff0c;等排序时再把数据一部分一部分地调入内存进行排序&#xff…

Java基础一(String)

Java基础一(String) 概览&#xff1a; String 被声明为 final&#xff0c;因此它不可被继承。(Integer 等包装类也不能被继承&#xff09; 在 Java 8 中&#xff0c;String 内部使用 char 数组存储数据。 public final class Stringimplements java.io.Serializable, Compa…

盘点并发编程的12种业务场景,面试别再说你不会并发了

前言 并发编程是一项非常重要的技术&#xff0c;无论在面试&#xff0c;还是工作中出现的频率非常高。 并发编程说白了就是多线程编程&#xff0c;但多线程一定比单线程效率更高&#xff1f; 答&#xff1a;不一定&#xff0c;要看具体业务场景。 毕竟如果使用了多线程&…

【MFC】网络通信(23)

Windows Sockets 规范是 Windows 平台下定义的可以兼容二进制数据传输的网络编程接口&#xff0c;是基于伯克利加利福尼亚大学的 BSD UNIX Sockets 的实现。 Socket 套接字分为两种类型&#xff1a;数据报 socket 和数据流 socket。 数据报套接字&#xff0c;即无连接套接字&…

网络通信基础 - 多路复用技术(频分多路复用、时分多路复用、波分多路复用)

文章目录 1 概述1.1 复用器 MUX 2 分类2.1 频分多路复用 FDM2.2 时分多路复用 TDM2.3 波分多路复用 WDM 1 概述 1.1 复用器 MUX 多路复用技术&#xff1a;把多个低速信道组合成一个高速信道的技术这种技术要用到两个设备&#xff0c;统称为 多路器&#xff08;MUX&#xff09…

Chapter13-基于 Netty 的通信实现

13.l Netty 介绍 Netty 是一个网络应用框架&#xff0c;或者说是一个 Java 网络开发库。 Netty 提供异步事件驱动的方式&#xff0c;使用它可以快速地开发出高性能的网络应用程序&#xff0c;比如客户端&#xff0f;服务器自定义协议程序&#xff0c;大大简化了网络程序的开发过…

ParticleSystem中的Culling Mode对耗时有怎样的影响

1&#xff09;ParticleSystem中的Culling Mode对耗时有怎样的影响 ​2&#xff09;关于API&#xff0c;OpenGL和Vulkan的疑问 3&#xff09;SVC分别搜集Keyword&#xff0c;多次搜集与单独搜集Warmup内存比较 4&#xff09;Occlusion Culling能否降低Culling耗时 这是第332篇UW…

kaggle酶稳定性预测第三名解决方案分享

最近在kaggle参加了诺维信举办的酶稳定性预测比赛 &#xff0c;最终很幸运获得了第三名&#xff0c;这篇文章主要是简单介绍一下解决方案&#xff0c;具体的数据和题目要求可访问上面的链接。 文章目录 模型概述特征工程模型XGB1XGB2XGB3 EnsembleNESP 3D geometryFoldXThermo…

AI即将夺走程序员的工作?实操验证

随着ChatGPT的普及&#xff0c;许多媒体开始报道“AI即将夺走程序员的工作”、“AI来了&#xff01;各大长都开始大幅度裁员”&#xff0c;这让一些初级码农感到担忧&#xff0c;而一些高级程序员则表示不屑一顾。这到底是不是“狼来了”。今天&#xff0c;我们将进行实际测试来…

实例了解GOT,PLT和动态链接

深入了解GOT,PLT和动态链接 我们使用一个简单的例子来了解动态链接库的链接过程&#xff0c;以及在这个过程中使用到的GOT和PLT的作用是什么。 文件准备 代码结构如下所示&#xff1a; [rootlocalhost test]# tree . . ├── main.c └── symbol.csymbol.c的内容如下&am…

聊聊布隆过滤器

目录 一、什么是布隆过滤器&#xff1f; 二、使用场景 三、原理 四、使用 4.1、Guava实现 4.2、Redisson实现 一、什么是布隆过滤器&#xff1f; 布隆过滤器&#xff08;英语&#xff1a;Bloom Filter&#xff09;是1970年由布隆提出的&#xff0c;是一种数据结构。它实际…

推式配货(Push)、拉式配货(Pull)和配送需求计划(DRP)的区别

随着电子商务的迅猛发展&#xff0c;物流配送服务已然成为企业竞争最为核心的环节&#xff0c;一个全面、完善的物流配送方案&#xff0c;能够帮助企业满足客户交期、节约运输和库存成本&#xff0c;促进各环节沟通&#xff0c;提高生产稳定性。同时&#xff0c;物流配送的许多…

如何在Java中高效地实现数字的反转和字符串的拼接?

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …

2023爱分析·工业互联网解决方案-设备后市场服务市场厂商评估报告

01 研究范围定义 “十四五”期间工信部等发布《“十四五”智能制造发展规划》&#xff0c;强调智能制造是我国制造强国主攻方向&#xff0c;加快推动智能制造发展&#xff0c;深化智能推广应用&#xff0c;开拓制造业数字化转型升级新路径&#xff0c;智能制造市场发展潜力进…

Pyqt应用相关之与Excel的联接

利用所学相关Pyqt实现对于Excel文件内部数据的处理&#xff0c;首先需要获取Excel的数据&#xff0c;在获取后进行保存处理即可完成相应的操作。 def save_data_btn_click(self):dir self.save_dir_text.text().strip()self.data_frame_group.to_excel(dir output.xlsx,sheet…