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


    介绍:

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

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

    类适配器

    介绍:

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

    例子:

    1. //1、统一的播放器接口
    2. interface MediaPlayer {
    3.   void play();
    4. }
    5. //2、两种不同的音频播放器
    6. class AdvancedMusicPlayer {
    7.   void playAdvancedMusic() {
    8.       System.out.println("Playing advanced music");
    9.   }
    10. }
    11. class SimpleMusicPlayer {
    12.   void playSimpleMusic() {
    13.       System.out.println("Playing simple music");
    14.   }
    15. }
    16. //3、类适配器。Adapter类,通过继承src类,实现dst类接口,完成src -> dst的适配
    17. class ClassAdapter extends AdvancedMusicPlayer implements MediaPlayer {
    18.   @Override
    19.   public void play() {
    20.       playAdvancedMusic();
    21.   }
    22. }
    23. //4、使用类适配器
    24.       MediaPlayer classAdapter = new ClassAdapter();
    25.       classAdapter.play();

    注意事项和细节

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

    对象适配器

    介绍

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

    例子

    1. //1、统一的播放器接口
    2. interface MediaPlayer {
    3.    void play();
    4. }
    5. //2、两种不同的音频播放器
    6. class AdvancedMusicPlayer {
    7.    void playAdvancedMusic() {
    8.        System.out.println("Playing advanced music");
    9.   }
    10. }
    11. class SimpleMusicPlayer {
    12.    void playSimpleMusic() {
    13.        System.out.println("Playing simple music");
    14.   }
    15. }
    16. //3、对象适配器:Adapter类做了修改,不是继承src类,而是持有src类的实例,以解决兼容性问题。
    17. class ObjectAdapter implements MediaPlayer {
    18.    //src类实例
    19.    private AdvancedMusicPlayer advancedPlayer;
    20.    
    21.    public ObjectAdapter(AdvancedMusicPlayer advancedPlayer) {
    22.        this.advancedPlayer = advancedPlayer;
    23.   }
    24.    @Override
    25.    public void play() {
    26.        advancedPlayer.playAdvancedMusic();
    27.   }
    28. }
    29.    // 4、使用对象适配器
    30.     AdvancedMusicPlayer advancedPlayer = new AdvancedMusicPlayer();
    31.     SimpleMusicPlayer simplePlayer = new SimpleMusicPlayer();
    32.    MediaPlayer objectAdapter = new ObjectAdapter(advancedPlayer);
    33.    objectAdapter.play();

    注意事项和细节

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

    接口适配器

    介绍

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

    例子

    1. //1、统一的播放器接口
    2. interface Player {
    3.    void play();
    4.    void stop();
    5.    void pause();
    6. }
    7. //2、创建一个抽象类,实现Player接口(默认空方法实现)
    8. abstract class PlayerAdapter implements Player {
    9.    @Override
    10.    public void play() {}
    11.    @Override
    12.    public void stop() {}
    13.    @Override
    14.    public void pause() {}
    15. }
    16. //3、创建具体的适配器类,只需重写方法即可
    17. class SimplePlayerAdapter extends PlayerAdapter {
    18.    @Override
    19.    public void play() {
    20.        System.out.println("Simple player is playing");
    21.   }
    22. }
    23. class AdvancedPlayerAdapter extends PlayerAdapter {
    24.    @Override
    25.    public void play() {
    26.        System.out.println("Advanced player is playing");
    27.   }
    28.    @Override
    29.    public void stop() {
    30.        System.out.println("Advanced player is stopped");
    31.   }
    32.    @Override
    33.    public void pause() {
    34.        System.out.println("Advanced player is paused");
    35.   }
    36. }
    37. //4、接口适配器使用
    38. public class InterfaceAdapterExample {
    39.    public static void main(String[] args) {
    40.        Player simplePlayer = new SimplePlayerAdapter();
    41.        simplePlayer.play();
    42.        Player advancedPlayer = new AdvancedPlayerAdapter();
    43.        advancedPlayer.play();
    44.        advancedPlayer.stop();
    45.        advancedPlayer.pause();
    46.   }
    47. }

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

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

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

    模拟实现

    1、Controller接口

    1. package com.pxl.testinterface.SpringMVCTest;
    2. public interface Controller {
    3. }
    4. class HttpController implements Controller{
    5.    public void doHttpHandler(){
    6.        System.out.println("http...");
    7.   }
    8. }
    9. class SimpleController implements Controller{
    10.    public void doHttpHandler(){
    11.        System.out.println("simple...");
    12.   }
    13. }

    2、适配器处理

    1. package com.pxl.testinterface.SpringMVCTest;
    2. public interface HandlerAdapter {
    3.    boolean supports(Object handler);
    4.    void handle( Object handler);
    5. }
    6. class SimpleHandlerAdapter implements HandlerAdapter {
    7.    public boolean supports(Object handler) {
    8.        return handler instanceof SimpleController;
    9.   }
    10.    public void handle(Object handler) {
    11.       ((SimpleController)handler).doHttpHandler();
    12.   }
    13. }
    14. class HttpHandlerAdapter implements HandlerAdapter {
    15.    public boolean supports(Object handler) {
    16.        return handler instanceof HttpController;
    17.   }
    18.    public void handle(Object handler) {
    19.       ((HttpController)handler).doHttpHandler();
    20.   }
    21. }

    3、调用方

    1. package com.pxl.testinterface.SpringMVCTest;
    2. import java.util.ArrayList;
    3. import java.util.List;
    4. public class DispatcherServlet {
    5.    public static List handlerAdapterList = new ArrayList<>();
    6.    public DispatcherServlet(){
    7.        handlerAdapterList.add(new HttpHandlerAdapter());
    8.        handlerAdapterList.add(new SimpleHandlerAdapter());
    9.   }
    10.    public void doDispatch(){
    11.        //此处是模拟SpringMVC从request中获得handler对象
    12.        //适配器可以获取到希望得Controller
    13.        HttpController controller = new HttpController();
    14.        //得到对应适配器
    15.        HandlerAdapter adapter = getHandler(controller);
    16.        adapter.handle(controller);
    17.   }
    18.    public HandlerAdapter getHandler(Controller controller){
    19.        for (HandlerAdapter adapter : this.handlerAdapterList) {
    20.            if (adapter.supports(controller)){
    21.                return adapter;
    22.           }
    23.       }
    24.        return null;
    25.   }
    26.    public static void main(String[] args) {
    27.        new DispatcherServlet().doDispatch();
    28.   }
    29. }

    总结

    自己的理解:

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

    注意事项和细节

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

  • 相关阅读:
    大三上人工智能课设,对亚马逊商城评论数据集进行数据分析并可视化(文本特征提取,KNN算法预测评分,进行词关联并绘制云图)
    使用 OpenVINO™和 Kubernetes 部署 AI 推理产品
    OAuth2-单点-多点-三方登录
    贪心算法(基础题)
    布隆过滤器Moudule安装
    unity 骨骼物理 头发 布料模拟
    注册字符设备使用gpio设备树节点控制led三盏灯的亮灭
    分布式锁java程序怎么处理 zk与redis
    学习C语言 8.10 枚举、位运算、指针函数
    Day11:文件和异常
  • 原文地址:https://blog.csdn.net/qq_62074445/article/details/136604174