墨风如雪博客

  • 源码小店
  • 导航站
  • 登录
  • java
  • 资源分享
让AI使用变得如此简单
  1. 首页
  2. java
  3. 设计模式
  4. 正文

设计模式:适配器模式

2023年 5月 9日 215点热度 0人点赞 0条评论

适配器模式(Adapter Pattern)是一种结构型设计模式,其目的是将一个类的接口转换为客户端所期望的另一个接口。适配器模式使得原本由于接口不兼容而无法协同工作的类可以一起工作。适配器模式通常用于将现有的类集成到新的系统中,而不需要修改现有的代码。

优点

适配器模式有以下优点:

  1. 提高了代码的复用性和灵活性:通过适配器,已有的类可以被适配到新的系统中,而不需要修改原有的代码。

  2. 可以让不兼容的接口协同工作:适配器模式可以让不兼容的类可以一起工作,从而提高了系统的整体协作能力。

  3. 可以透明地使用已有的类:使用适配器模式,客户端可以透明地使用已有的类,不需要了解适配器和被适配者之间的细节。

缺点

适配器模式也有一些缺点:

  1. 增加了系统的复杂性:引入适配器会增加系统的复杂性,并且可能会影响到系统的性能。

  2. 可能会导致过多的适配器类:如果系统中存在大量不兼容的类,就需要创建大量的适配器类,这可能会导致系统的维护难度增加。

使用场景

适配器模式适用于以下场景:

  1. 已有的类的接口与系统所需的接口不兼容,需要进行适配。

  2. 需要透明地使用已有的类,但是已有的类的接口不能满足系统的需求。

下面是一个简单的Java代码示例,说明如何使用适配器模式。假设我们有一个现有的类Adaptee,它有一个specificRequest()方法,但是它的接口与我们期望的客户端接口Target不兼容。我们可以创建一个适配器类Adapter,实现Target接口并包装Adaptee类,以便可以在客户端中使用。代码如下:

// 目标接口
interface Target {
    void request();
}

// 源接口
class Adaptee {
    void specificRequest() {
        System.out.println("Adaptee specificRequest");
    }
}

// 适配器
class Adapter implements Target {
    private Adaptee adaptee;

    Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public void request() {
        System.out.println("Adapter request");
        adaptee.specificRequest();
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        Adaptee adaptee = new Adaptee();
        Target target = new Adapter(adaptee);
        target.request();
    }
}

在上面的示例中,Target是目标接口,它定义了客户端所期望的接口。Adaptee是源接口,它已经存在但无法直接满足客户端的需求。Adapter是适配器类,它实现了Target接口并包装了Adaptee类,以便在客户端中使用。在Adapter的request()方法中,它先打印出一条信息,然后调用Adaptee的specificRequest()方法。

在客户端中,我们首先创建一个Adaptee对象,然后通过创建一个Adapter对象,将它包装成Target接口。最后,我们可以调用Target接口的request()方法,该方法内部会调用Adapter的request()方法,从而实现了将Adaptee转换为Target接口的功能。

spring当中的使用

在Spring框架中,适配器模式被广泛应用于处理不同类型的请求。具体来说,Spring MVC框架使用适配器模式来处理不同类型的Controller请求,以便将请求映射到相应的处理程序方法。

在Spring MVC框架中,请求处理程序可以是不同类型的Controller,例如注解控制器(Annotation Controllers)、AbstractController、SimpleFormController等。这些Controller的处理方法签名不同,因此需要适配器来将请求映射到正确的处理程序方法,以便正确地处理请求。

在Spring MVC框架中,适配器模式的具体实现是HandlerAdapter接口,它定义了适配器的通用接口。每种类型的Controller都需要实现自己的适配器,以便将请求映射到相应的处理程序方法。例如,注解控制器使用RequestMappingHandlerAdapter适配器,AbstractController使用SimpleControllerHandlerAdapter适配器,SimpleFormController使用SimpleFormControllerHandlerAdapter适配器。

以下是一个简单的示例,演示Spring MVC框架中适配器模式的使用。假设我们有一个注解控制器MyController,它有一个处理方法handleRequest(),但是它的方法签名与HandlerAdapter接口的handle()方法不兼容。我们可以创建一个RequestMappingHandlerAdapter适配器,实现HandlerAdapter接口并包装MyController类,以便将请求映射到正确的处理程序方法。代码如下:

@Controller
public class MyController {
    @RequestMapping("/myRequest")
    public void handleRequest(HttpServletRequest request, HttpServletResponse response) {
        // 处理请求
    }
}

public class MyHandlerAdapter implements HandlerAdapter {
    @Override
    public boolean supports(Object handler) {
        return (handler instanceof MyController);
    }

    @Override
    public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        MyController controller = (MyController) handler;
        controller.handleRequest(request, response);
        return null;
    }

    @Override
    public long getLastModified(HttpServletRequest request, Object handler) {
        return -1;
    }
}

public class MyDispatcherServlet extends HttpServlet {
    private List<HandlerAdapter> handlerAdapters;

    public void init() {
        handlerAdapters = new ArrayList<>();
        handlerAdapters.add(new MyHandlerAdapter());
    }

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Object handler = getHandler(request);
        HandlerAdapter handlerAdapter = getHandlerAdapter(handler);
        handlerAdapter.handle(request, response, handler);
    }

    private Object getHandler(HttpServletRequest request) {
        // 根据请求信息获取处理程序
    }

    private HandlerAdapter getHandlerAdapter(Object handler) {
        for (HandlerAdapter adapter : handlerAdapters) {
            if (adapter.supports(handler)) {
                return adapter;
            }
        }
        throw new IllegalArgumentException("No adapter for handler " + handler);
    }
}

在上面的示例中,MyController是一个注解控制器,它定义了一个处理方法handleRequest()。MyHandlerAdapter是一个适配器类,它实现了HandlerAdapter接口并包装了MyController类,以便将请求映射到正确的处理程序方法。在MyHandlerAdapter的handle()方法中,它将请求转发给MyController的handleRequest()方法。

在MyDispatcherServlet的service()方法中,它首先获取请求的处理程序,然后通过getHandlerAdapter()方法获取相应的适配器。最后,它调用适配器的handle()方法,将请求映射到正确的处理程序方法。

总结

Spring MVC框架中使用适配器模式可以处理不同类型的Controller请求,提高了代码的复用性和灵活性,同时也让不兼容的接口协同工作。适配器模式可以透明地使用已有的类,让客户端可以透明地使用已有的Controller,不需要了解适配器和被适配者之间的细节,使得开发更加简单和高效。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: java 教程 设计模式 适配器
最后更新:2023年 5月 9日

墨风如雪

一个热爱生活,热爱分享的程序员

打赏 点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

墨风如雪

一个热爱生活,热爱分享的程序员

最新 热点 随机
最新 热点 随机
降维打击!Mistral Voxtral:开源语音的“终结者”已上线! AI“游侠”降临A股:16个“大脑”组团“炒股”,30秒“算命”市场! 视频魔法来了!AI能实时“变脸”直播,连游戏画面也能瞬间换装? 告别“听指令”,AI要“自己动手”了!ChatGPT Agent,AI界的“全能选手”已上线! 8B 模型吊打 671B?数学证明界“卷王”Goedel-Prover-V2 来了! Kiro来了!亚马逊放大招,软件开发要被AI“绑架”了吗?
昆仑万维扔出王炸:32B模型干翻671B,代码界迎来全能修理工!8亿参数撬动实时混音!谷歌开源“口袋DJ”,人人都能玩转音乐告别插件时代!OmniGen2:一个模型,通吃所有AIGC神操作2000万次呼唤背后,蓝骑士有了“赛博外挂”智能触手可及:Google Gemma-3n 系列模型,让万物皆能“思考”AI圈大地震!120亿参数的FLUX编辑器开源,你的显卡准备好了吗?
NGINX配置文件详解 Python 图像处理:红点与数字识别 国产视频AI卷出新高度!海螺02不止能跳舞,还懂物理 Java 中 synchronized 的使用方法及注意事项 java 消息队列框架RabbitMQ的(超详细总结) 苹果设备上的“大模型炼丹炉”:mlx-lm-lora,让你的 Mac 变身 AI 工作站!
标签聚合
教程 设计模式 AI 算法 deepseek spring java 大模型

COPYRIGHT © 2023 墨风如雪博客. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

免责声明 - 隐私政策