墨风如雪博客

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

设计模式:适配器模式

2023年 5月 9日 165点热度 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日

墨风如雪

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

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

文章评论

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

墨风如雪

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

最新 热点 随机
最新 热点 随机
告别机械感!OpenAudio S1让AI声音活起来 Sora触手可及!微软必应AI视频生成器,全民创作时代来临? 阿里WebAgent开源:引领自主搜索新纪元 重磅炸弹!字节跳动开源BAGEL:70亿参数,统一多模态理解与生成,AI“全能王”诞生记! 小米MiMo-VL:7B参数,怎么就成了多模态界的“越级打怪王”? 炸裂!DeepSeek 8B 量化版降临:告别显存焦虑,你的 3080 Ti 也能玩转顶级大模型了!
AI圈炸锅了!Mistral Medium 3:性能 SOTA,成本打骨折,企业玩家的新宠?字节终于开源“扣子”同款引擎了!FlowGram:AI 时代的可视化工作流利器告别“微信黑箱”!Chatlog:让你的聊天记录也能拥有“AI大脑”!字节跳动 Seed-Coder-8B:不靠人工洗数据,这80亿参数的小模型如何写出顶尖代码?85倍速的视觉革命:苹果发布 FastVLM,让你的 iPhone ‘看图说话’,快到飞起!告别AI视频“变脸怪”!腾讯混元Hunyuan Custom重磅开源,主体一致性“王炸”来了!
browser-use: 让你的代码像人一样“上网冲浪”——API驱动的浏览器自动化利器 Spring三大特性 AOP知识点详解 A2A协议引爆AI圈:谷歌联手50+巨头终结‘智能体孤岛’,谁将吃掉协作生态的万亿蛋糕? Claude 3.7 Sonnet:AI编程新纪元,混合推理能力碾压竞品,人类工作模式将颠覆? 低资源占用的数据库 SQLite 记录一次Ubuntu SSH报错问题的排查与解决
标签聚合
spring 教程 算法 动态规划 AI deepseek java 设计模式

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

Theme Kratos Made By Seaton Jiang

免责声明 - 隐私政策