适配器模式已经在SpringMVC中的源码实现

介绍:

1、适配器模式将某个类的接口转换成客户端期望的另一种接口表示
2、目的:兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为:包装器。
3、属于:结构型模式
4、分3类:
    1)类适配器
    2)对象适配器
    3)接口适配器
5、解耦。用户也只会看到源头和结果。

目标 《- 适配器 《- 被适配器者

类适配器

介绍:

1、类适配器模式介绍
基本介绍:Adapter类,通过继承src类,实现dst类接口,完成src -> dst的适配

例子:

//1、统一的播放器接口
interface MediaPlayer {
    void play();
}
​
​
//2、两种不同的音频播放器
class AdvancedMusicPlayer {
    void playAdvancedMusic() {
        System.out.println("Playing advanced music");
    }
}
​
class SimpleMusicPlayer {
    void playSimpleMusic() {
        System.out.println("Playing simple music");
    }
}
​
​
//3、类适配器。Adapter类,通过继承src类,实现dst类接口,完成src -> dst的适配
class ClassAdapter extends AdvancedMusicPlayer implements MediaPlayer {
    @Override
    public void play() {
        playAdvancedMusic();
    }
}
​
//4、使用类适配器
        MediaPlayer classAdapter = new ClassAdapter();
        classAdapter.play();

注意事项和细节

1、Java是单继承的,所以类适配器需要继承src类这是一个缺点,因为这要求了dst必须是接口,有局限性
2、src类的方法在Adapter中都会暴露出来,也增加了使用成本
3、由于其继承了src类,所以它可以根据需求重写src类方法,使Adapter灵活性增强了

对象适配器

介绍

1、基本思路和类适配器相同,只是将Adapter类做了修改,不是继承src类,而是持有src类的实例,以解决兼容性问题。
即:持有src类,实现dst类接口,完成src -> dst的适配
​
2、根据合成复用原则,在系统中尽量使用关联关系代替继承关系

例子

//1、统一的播放器接口
interface MediaPlayer {
    void play();
}
​
​
//2、两种不同的音频播放器
class AdvancedMusicPlayer {
    void playAdvancedMusic() {
        System.out.println("Playing advanced music");
    }
}
​
class SimpleMusicPlayer {
    void playSimpleMusic() {
        System.out.println("Playing simple music");
    }
}
​
//3、对象适配器:Adapter类做了修改,不是继承src类,而是持有src类的实例,以解决兼容性问题。
class ObjectAdapter implements MediaPlayer {
    //src类实例
    private AdvancedMusicPlayer advancedPlayer;
    
    public ObjectAdapter(AdvancedMusicPlayer advancedPlayer) {
        this.advancedPlayer = advancedPlayer;
    }
​
    @Override
    public void play() {
        advancedPlayer.playAdvancedMusic();
    }
}
​
​
    // 4、使用对象适配器
     AdvancedMusicPlayer advancedPlayer = new AdvancedMusicPlayer();
     SimpleMusicPlayer simplePlayer = new SimpleMusicPlayer();
    MediaPlayer objectAdapter = new ObjectAdapter(advancedPlayer);
    objectAdapter.play();

注意事项和细节

1、对象适配器和类适配器是同一种思想,只是实现不同。根据合成复用原则,使用组合替代继承,它解决了类适配器必须继承src的局限性问题,也不要求dst必须是接口
​
2、使用成本更低,更灵活

接口适配器

介绍

1、适配器模式又称缺省适配器模式
2、当不需要全部实现接口提供方法时,可先设计一个抽象类实现接口,并为改接口中每一个方法提供一个默认实现(空方法),那么该抽象类子类可以选择性的覆盖父类方法
3、适用于一个接口不想使用所有方法情况

例子

//1、统一的播放器接口
interface Player {
    void play();
    void stop();
    void pause();
}
​
​
//2、创建一个抽象类,实现Player接口(默认空方法实现)
abstract class PlayerAdapter implements Player {
    @Override
    public void play() {}
​
    @Override
    public void stop() {}
​
    @Override
    public void pause() {}
}
​
​
//3、创建具体的适配器类,只需重写方法即可
class SimplePlayerAdapter extends PlayerAdapter {
    @Override
    public void play() {
        System.out.println("Simple player is playing");
    }
}
​
class AdvancedPlayerAdapter extends PlayerAdapter {
    @Override
    public void play() {
        System.out.println("Advanced player is playing");
    }
​
    @Override
    public void stop() {
        System.out.println("Advanced player is stopped");
    }
​
    @Override
    public void pause() {
        System.out.println("Advanced player is paused");
    }
}
​
//4、接口适配器使用
public class InterfaceAdapterExample {
    public static void main(String[] args) {
        Player simplePlayer = new SimplePlayerAdapter();
        simplePlayer.play();
​
        Player advancedPlayer = new AdvancedPlayerAdapter();
        advancedPlayer.play();
        advancedPlayer.stop();
        advancedPlayer.pause();
    }
}

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

适配器模式在SpringMVC框架应用的源码剖析

1、SpringMVC中的HandlerAdapter使用到了适配器模式
2、SpringMVC请求处理的流程回顾
3、使用HandlerAdapter的原因分析

模拟实现

1、Controller接口

package com.pxl.testinterface.SpringMVCTest;
​
public interface Controller {
​
}
class HttpController implements Controller{
    public void doHttpHandler(){
        System.out.println("http...");
    }
}
​
class SimpleController implements Controller{
    public void doHttpHandler(){
        System.out.println("simple...");
    }
}
​

2、适配器处理

package com.pxl.testinterface.SpringMVCTest;
​
public interface HandlerAdapter {
    boolean supports(Object handler);
    void handle( Object handler);
}
class SimpleHandlerAdapter implements HandlerAdapter {
    public boolean supports(Object handler) {
        return handler instanceof SimpleController;
    }
    public void handle(Object handler) {
        ((SimpleController)handler).doHttpHandler();
    }
}
class HttpHandlerAdapter implements HandlerAdapter {
    public boolean supports(Object handler) {
        return handler instanceof HttpController;
    }
    public void handle(Object handler)  {
        ((HttpController)handler).doHttpHandler();
    }
}

3、调用方

package com.pxl.testinterface.SpringMVCTest;
​
import java.util.ArrayList;
import java.util.List;
​
public class DispatcherServlet {
    public static List<HandlerAdapter> handlerAdapterList = new ArrayList<>();
    public DispatcherServlet(){
        handlerAdapterList.add(new HttpHandlerAdapter());
        handlerAdapterList.add(new SimpleHandlerAdapter());
    }
​
    public void doDispatch(){
        //此处是模拟SpringMVC从request中获得handler对象
        //适配器可以获取到希望得Controller
        HttpController controller = new HttpController();
​
        //得到对应适配器
        HandlerAdapter adapter = getHandler(controller);
        adapter.handle(controller);
​
    }
    public HandlerAdapter getHandler(Controller controller){
        for (HandlerAdapter adapter : this.handlerAdapterList) {
            if (adapter.supports(controller)){
                return adapter;
            }
        }
        return null;
    }
​
    public static void main(String[] args) {
        new DispatcherServlet().doDispatch();
    }
}

总结

自己的理解:

当客户端调用适配器时,适配器会返回给客户端一个符合客户端期望的接口的类实例。这样客户端就可以通过适配器来获取想要的类,而无需关心具体的实现细节。
​
精简:
我调用Adapter,Adapter返回给我一个想要的类

注意事项和细节

1、三种命名方式,是根据src是以怎样的形式给到Adapter(在Adapter的形式)来命名
2、
    1)类适配器:以类给到,在Adapter里,将src当作类,继承
    2)对象适配器:以对象给到,在Adapter里,将src作为对象,持有
    3)接口适配器:以接口给到,在Adapter里,将src作为一个接口,实现
​
3、Adapter模式最大作用:将原本不兼容的接口融合一起工作
4、实际开发中不仅仅是我们将的3种经典形式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/445971.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ESP8266开发板 + DHT11+远程开关+ThingsCloud+APP+QQ邮件推送告警

ESP32 是乐鑫公司推出的 WiFi 芯片&#xff0c;它不仅支持 WiFi 和 BLE&#xff0c;还可以作为可编程的 MCU&#xff0c;通过 Espressif IDF、Arduino 等框架编写固件&#xff0c;用于非常广泛的物联网场景。 这个教程我们分享如何在 Arduino IDE 中使用 ThingsCloud ESP SDK&…

ElasticSearch之排序,fielddata和docvalue

写在前面 es搜索返回结果的排序默认是按照得分的高低来排的&#xff0c;本文来看下如何按照字段来排序&#xff0c;实现类似于MySQL的order by xxx的效果。 1&#xff1a;什么是fileddata和doc_value 参考ElasticSearch之零碎知识点 和一文带你彻底弄懂ES中的doc_values和fi…

Igraph入门指南 5

2、graph_from系列&#xff0c;将其他R数据结构转换成图 2-1 邻接矩阵转图&#xff1a;graph_from_adjacency_matrix 可以接受Matrix包创建的稀疏矩阵作为参数 邻接矩阵中行的顺序被保留&#xff0c;并作为图中顶点的顺序。 本函数几个重要的参数&#xff1a; weighted&am…

【组合递归】【StringBuilder】Leetcode 17. 电话号码的字母组合

【组合递归】【StringBuilde】Leetcode 17. 电话号码的字母组合 StringBulider常用方法&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;17. 电…

Java宝典-抽象类和接口

目录 1. 抽象类1.1 抽象类的概念1.2 抽象类的语法1.3 抽象类的特点 2. 接口2.1 接口的概念2.2 接口的语法2.3 接口的特点2.4 实现多个接口2.5 接口的继承 3. 接口使用案例 铁汁们好,今天我们学习抽象类和接口~ 1. 抽象类 1.1 抽象类的概念 什么是抽象类?在面向对象中,如果一…

【Leetcode】top 100 双指针

283 移动零 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 分析&#xff1a;双指针初始为0&#xff1b;left指针找零值&#xff0c;right指针找非零值&#xff1b;由于需要保持非零元素的相对顺序&#xff0c…

02-组件化编程与Vu额 Click脚手架

1.Vue组件化编程(只有1个数字是一级标题) 1.1 模块与组件、模块化与组件化(两个数字组成是二级标题) 1.1.1模块(三个数字是三级标题 依次类推) 理解&#xff1a;向外提供特定功能的 js 程序&#xff0c;一般就是一个 js 文件为什么&#xff1a;js 文件很多很复杂作用&#xf…

【性能测试】性能测试各知识第1篇:性能测试大纲【附代码文档】

性能测试完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;性能测试大纲。。。。。。。。。。。。。。 全套笔记资料代码移步&#xff1a; 前往gitee仓库查看 感兴趣的小伙伴可以自取哦&#xff0c;欢迎大家点赞转发~ 性能测试大纲 |序号|阶段|概述| |--…

【C++】三大特性之继承

1 继承的概念及定义 1.1 继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展、增加功能&#xff0c;这样产生新的类&#xff0c;称派生类&#xff08;或子类&#xff09;。而被继承的…

【NR 定位】3GPP NR Positioning 5G定位标准解读(九)-增强的小区ID定位

前言 3GPP NR Positioning 5G定位标准&#xff1a;3GPP TS 38.305 V18 3GPP 标准网址&#xff1a;Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;一&#xff09;-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;…

云服务器python版本冲突解决(awd平台搭建)

文章目录 yum和apt-getdockerpython环境问题 大家在使用python时&#xff0c;难免会使用他人的代码&#xff0c;自己是python3&#xff0c;而别人的是python2.我们直接运行会报错(比如print函数括号的问题)。但是去修改代码又很麻烦。这里给大家推荐conda。我以我搭建awd平台为…

toB开发范式

前言 B端开发&#xff0c;也被称为后台开发或者企业级开发&#xff0c;是针对企业或者组织的业务需求进行的软件开发。在 B 端开发中&#xff0c;我们通常关注的是系统的功能性、稳定性、可扩展性以及安全性&#xff0c;从面向过程编程 -> 面向对象编程 组合式编程 以下是…

【谈一谈】并发_Synchronized

Synchronized 又到周末了,最近的话(有点子小日子不好过,哈哈哈!~)但是,我还是报之以歌哈哈哈 本次写关于并发_Synchronized的优化以及底层实现原理 说说心里话~其实是非常的累,原因应该怎么说呢?我发现自己在如今的这家公司,我处于一种活多钱少以及关键现在给的或自己不想干,因…

新版Android Studio火烈鸟 在新建项目工程时 无法选java的语言模板解决方法

前言 最近下载最新版androidstudio时 发现不能勾选java语言模板了 如果快速点击下一步 新建项目 默认是kotlin语言模板 这可能和google主推kt语言有关 勾选1 如图所示 如果勾选 No Activity 这个模板 是可以选java语言模板的 但是里面没有默认的Activity 勾选2 和以前的用法…

关于安卓ZXing条码识别(一)引入源码

背景 从0-1引入安卓zxing&#xff0c;实现条码识别 环境 win10 as4 jdk8 引入 首先&#xff0c;官方网站&#xff0c;就是源码。链接 选择你要引入的分支&#xff0c;这里博主选择的是最近更新的分支&#xff0c;如下图&#xff1a; 上图中&#xff0c;1和2都需要引入&am…

车载诊断协议DoIP系列 —— 诊断报文和诊断报文应答传输层安全(TLS)

车载诊断协议DoIP系列 —— 诊断报文和诊断报文应答&传输层安全(TLS) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎…

2021年江苏省职业院校技能大赛高职组 “信息安全管理与评估”赛项任务书

2021年江苏省职业院校技能大赛高职组 “信息安全管理与评估”赛项任务书 一、赛项时间&#xff1a;二、赛项信息三、竞赛内容&#xff1a;第一阶段任务书&#xff08;300分&#xff09;任务1&#xff1a;网络平台搭建&#xff08;60分&#xff09;任务2&#xff1a;网络安全设备…

23 经典卷积神经网络 LeNet【李沐动手学深度学习v2课程笔记】 (备注:提到如何把代码从CPU改到在GPU上使用)

目录 1. LeNet 2. 实现代码 3. 模型训练 4. 小结 本节将介绍LeNet&#xff0c;它是最早发布的卷积神经网络之一&#xff0c;因其在计算机视觉任务中的高效性能而受到广泛关注。 这个模型是由AT&T贝尔实验室的研究员Yann LeCun在1989年提出的&#xff08;并以其命名&…

第十九天-分布式爬虫scrapy-redis

1.scrapy-redis介绍 1.scrapy框架程 2.分布式爬虫将多个主机组合起乱来&#xff0c;完成一个爬虫任务&#xff0c;快速高效的提高爬虫效率 3.scrapy-redis框架&#xff0c; 优点&#xff1a;1.加快项目的运行速度2.单节点不稳定不影响整个系统的稳定性 3.断点续爬 缺点&…

基于C++和Qt Creator实现的仿制网易云音乐播放器

目录 总体介绍开发环境技术介绍项目目录项目介绍特殊说明Gitee地址 总体介绍 仿照网易云播放器界面实现&#xff0c;目的在于锻炼C编程能力&#xff0c;熟练掌握Qt Creator各种组件的使用及样式设置、界面布局、QtPlugin技术、QXml读写XML文件方法、Qss文件的编写及使用等。 …