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

news2024/11/6 3:16:11

介绍:

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种经典形式

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

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

相关文章

方程式工具包远程溢出漏洞图形界面版V0.3(内置永恒之蓝、永恒冠军、永恒浪漫等)

Part1 前言 大家好&#xff0c;我是ABC_123。我从年前到现在&#xff0c;一直在整理曾经写过的红队工具&#xff0c;逐步把自己认为比较好用的原创工具发出来给大家用一用&#xff0c;方便大家在日常的攻防比赛、红队评估项目中解放双手&#xff0c;节省时间精力和体力。本期给…

MySQL中常用的操作语句已汇总

目录 一、库语句 1.查询现有数据库 2.创建数据库 3.选中数据库 ​编辑 4.删除数据库 二、初阶表操作 1.查看数据库现有表 2.查看表结构 3.创建表 4.删除表 5.全列查询 6.删除表2 7.修改操作 三、插入操作 1.全列插入 2.指定列插入 3.一次插入多组数据 4.插入…

SpringBoot集成netty实现websocket通信

实现推送消息给指定的用户 一、依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://m…

redis-集群 原生部署和工具自动部署

什么redis集群&#xff1f; redis集群是一个提供在多个redis节点之间共享数据的程序集。它并不像redis主从复制模式那样仅提供一个master节点来提供写服务&#xff0c;而是会提供多个master节点来提供写服务&#xff0c;每个master节点中存储的数据都不一样&#xff0c;这些数据…

HarmonyOS系统开发基础环境搭建

目录 一 鸿蒙介绍&#xff1a; 1.1 HarmonyOS系统 1.2 HarmonyOS软件编程语言 二 HarmonyOS编程环境搭建 1.1 官网下载地址 1.2搭建开发流程 1.3 创建安装目录 1.4 下载DevEco Studio​编辑 1.5 下载后点击安装 1.6 自动添加桌面快捷和bin路径 ​编辑1.7 安装好运行 …

[Angular 基础] - 表单:模板驱动表单

[Angular 基础] - 表单&#xff1a;模板驱动表单 之前的笔记&#xff1a; [Angular 基础] - routing 路由(上) [Angular 基础] - routing 路由(下) [Angular 基础] - Observable Angular 内置两种表单的支持&#xff0c;这篇写的就是第一种&#xff0c;即模板驱动表单 (Tem…

wps由于找不到krpt.dll,无法继续执行代码的解决方法

遇到由于找不到krpt.dll,无法继续执行代码的问题时&#xff0c;理解如何修复这个问题变得至关重要。本文会教大家krpt.dll的恢复流程&#xff0c;并介绍该DLL文件的相关属性。我们将一步步指导你如何处理缺失文件的情况&#xff0c;让你能够解决阻碍代码正常运行的障碍&#xf…

C语言初学10:typedef

一、作用 为用户定义的数据类型取一个新名字 二、对结构体使用typedef定义新的数据类型名字 #include <stdio.h> #include <string.h>typedef struct Books //使用 typedef 来定义一个新的数据类型名字 {char title[50];} book;int main( ) {//book是typedef定…

背包问题算法

背包问题算法 0-1背包问题二维数组一维数组 完全背包问题二维数组一维数组 多重背包问题一维数组 0-1背包问题 问题&#xff1a;背包的容量为9&#xff0c;有重量分别为[2, 4, 6, 9]的四个物品&#xff0c;价值分别为[3, 4, 5, 6]&#xff0c;求背包能装的物品的最大价值是多少…

LiveNVR监控流媒体Onvif/RTSP功能-支持云端录像监控视频集中存储录像回看录像计划配置NVR硬件设备录像回看

LiveNVR支持云端录像监控视频集中存储录像回看录像计划配置NVR硬件设备录像回看 1、流媒体服务软件2、录像回看3、查看录像3.1、时间轴视图3.2、列表视图 4、如何分享时间轴录像回看&#xff1f;5、iframe集成示例7、录像计划7、相关问题7.1、录像存储位置如何配置&#xff1f;…

【电路】工作于直流4.5V电压的声控小灯

这个声控小灯用于控制4.5V直流供电的小灯泡&#xff0c;可用作学生实验也可用作声控夜光小灯。电路主要由5G555时基集成电路和一些分立元件组成&#xff0c;如下图所示&#xff1a; 工作原理 压电陶瓷片B与晶体三极管VT1&#xff0c;电阻R1&#xff0c;和电阻R2等组成了声控脉…

数据结构之单链表及其实现!

目录 ​编辑 1. 顺序表的问题及思考 2.链表的概念结构和分类 2.1 概念及结构 2.2 分类 3. 单链表的实现 3.1 新节点的创建 3.2 打印单链表 3.3 头插 3.4 头删 3.5 尾插 3.6 尾删 3.7 查找元素X 3.8 在pos位置修改 3.9 在任意位置之前插入 3.10 在任意位置删除…

【Primsjs】vue+代码高亮

效果 括号变色括号鼠标移入高亮效果 代码效果 目录树 在这里插入图片描述 安装 cnpm i primsjs简介 文档&#xff08;点我进去&#xff09; 备用地址-https://prismjs.com/docs/index.html Primsjs使用 导入配置插件 注意&#xff1a;需要什么插件就导入什么插件 码 &l…

Linux centos6安装rz、sz命令

centos6传文件提示command not found # yum install lrzsz 提示错误 wget http://www.ohse.de/uwe/releases/lrzsz-0.12.20.tar.gz 下载离线包 https://www.ohse.de/uwe/software/lrzsz.html 下载最新版本 [rootnode1 ~]# tar -zxvf lrzsz-0.12.20.tar.gz …

PV与PVC知多少?解锁CKA认证考点攻略!

往期精彩文章 : 提升CKA考试胜算&#xff1a;一文带你全面了解RBAC权限控制&#xff01;揭秘高效运维&#xff1a;如何用kubectl top命令实时监控K8s资源使用情况&#xff1f;CKA认证必备&#xff1a;掌握k8s网络策略的关键要点提高CKA认证成功率&#xff0c;CKA真题中的节点维…

蓝桥省赛倒计时 35 天-双指针

双指针介绍 双指针算法是一种常用的算法技巧&#xff0c;它通常用于在数组或字符串中进行快速查找、匹配、排序或移动操作。 pointer 双指针并非真的用指针实现&#xff0c;一般用两个变量来表示下标&#xff08;在后面都用指针来表示&#xff09;。 双指针算法使用两个指针在数…

【Java JVM】Class 文件

Java 的口号 “一次编写, 到处运行 (Write Once, Run Anywhere)” 的基础: JVM 和 所有平台都统一支持的程序存储格式 – 字节码 (Byte Code)。 只要在对应的平台安装对应的 JVM, 将我们编写的源码编译为 Class 文件, 就能达到了一次编写, 导出运行的目标, 中间的所有细节由不同…

0103n阶行列式-行列式-线性代数

文章目录 一 n阶行列式二 三阶行列式三 特殊行列式结语 一 n阶行列式 ∣ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋯ ⋯ ⋯ ⋯ a n 1 a n 2 ⋯ a n n ∣ \begin{vmatrix}a_{11}&a_{12}&\cdots&a_{1n}\\a_{21}&a_{22}&\cdots&a_{2n}\\\cdots&\cdots…

大型房企知识竞赛活动方案

&#xff08;一&#xff09; 线上挑战赛 1、加入团队 个人可以依据自身情况选择加入初始团队&#xff0c;也可创建团队。 2、题库来源 参考权威题库&#xff0c;适当加入公司帮扶贫困县的相关历史数据题目 3、小程序活动专题页 模块包括&#xff1a;党史知识线上挑战赛、活动宣…

Unity 采用自定义通道ShaderGraph实现FullScreen的窗户雨滴效果

效果如下 ShaderGraph实现 N21 随机化 DragLayer分层 将DragLayer分成四层&#xff0c;分别调整每层的缩放和大小 Shader实现的链接&#xff08;Unity 雨水滴到屏幕效果&#xff09; 我也是参考这个实现Shader Graph