千家信息网

怎么理解web设计模式中的适配器模式

发表于:2024-12-04 作者:千家信息网编辑
千家信息网最后更新 2024年12月04日,本篇内容介绍了"怎么理解web设计模式中的适配器模式"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!适
千家信息网最后更新 2024年12月04日怎么理解web设计模式中的适配器模式

本篇内容介绍了"怎么理解web设计模式中的适配器模式"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

适配器模式(Adapter Pattern) :将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。

模式结构

适配器模式包含如下角色:

  • Target:目标抽象类

  • Adapter:适配器类

  • Adaptee:适配者类

  • Client:客户类

源码导读

我们都知道springMVC就用到了适配器模式,那他是怎么适配呢,我们来看看它的源码,首先我们要清楚springMVC的执行原理,它的整个流程我这里就不像述了,说一下关键的部分:

  1. DispatcherServlte会根据配置文件信息注册HandlerAdapter,如果在配置文件中没有配置,那么DispatcherServlte会获取HandlerAdapter的默认配置,如果是读取默认配置的话,DispatcherServlte会读取DispatcherServlte.properties文件,该文件中配置了三种HandlerAdapterHttpRequestHandlerAdapterSimpleControllerHandlerAdapterAnnotationMethodHandlerAdapterDispatcherServlte会将这三个HandlerAdapter对象存储到它的handlerAdapters这个集合属性中,这样就完成了HandlerAdapter的注册。

  2. DispatcherServlte会根据handlerMapping传过来的controller与已经注册好了的HandlerAdapter一一匹配,看哪一种HandlerAdapter是支持该controller类型的,如果找到了其中一种HandlerAdapter是支持传过来的controller类型,那么该HandlerAdapter会调用自己的handle方法,handle方法运用java的反射机制执行controller的具体方法来获得ModelAndView

DispatcherServlte部分源码

public class DispatcherServlet extends FrameworkServlet {    ......    ......    @Nullable    private List handlerMappings;    @Nullable    private List handlerAdapters;   protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {        HttpServletRequest processedRequest = request;        HandlerExecutionChain mappedHandler = null;        boolean multipartRequestParsed = false;        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);        try {            try {                ModelAndView mv = null;                Object dispatchException = null;                try {                    ......                    ......                    HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());                    ......                    ......                    mv = ha.handle(processedRequest, response, mappedHandler.getHandler());                    if (asyncManager.isConcurrentHandlingStarted()) {                        return;                    }                    this.applyDefaultViewName(processedRequest, mv);                    mappedHandler.applyPostHandle(processedRequest, response, mv);                } catch (Exception var20) {                    dispatchException = var20;                } catch (Throwable var21) {                                ......                }                        ......            } catch (Exception var22) {               ......            } catch (Throwable var23) {                     ......            }        } finally {            ......            ......        }    }}

这里只放上比较关键的代码,我们可以看到当一个请求进入doDispatch()方法的时候,它先去getHandlerAdapter()中拿到适配器,这就是第二步中根据handlerMapping中的controller找到对应适配器。找到适配器后通过ha.handle(processedRequest, response, mappedHandler.getHandler())执行我们自己的controllermappedHandler.getHandler()就是我们自己的controller

至于handler()如何知道该去执行controller中哪个方法,当然是通过注解去转换对应方法的。因此,这里的适配器模式还不是特别的纯粹,还结合了反射机制。DispatcherServlte属于客户端,我们的Controller属于被适配的类,HandlerAdapter属于适配器。

现在我们假定需要写一个线程池任务调度框架,我们知道JDK自带的线程框架可以创建一个线程池,但是线程池只能传入实现runnable接口或者callable接口的对象。

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();cachedThreadPool.execute(new Runnable() {    @Override     public void run() {     }})

那我们要咋样可以让客户端使用的时候无须继承runnable来使用我们的这个框架呢。你可以像springMVC一样使用适配器加注解。也可以提供一个实现Runnable接口的抽象适配器类,让客户端进行一定的配置来将普通的类适配到Runnable

关于适配器的使用方面还有很多,比如spring securityWebSecurityConfigurerAdapternetty中的ChannelInboundHandlerAdapter 对于适配器模式类名一般都以Adapter结尾

"怎么理解web设计模式中的适配器模式"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

适配 适配器 模式 配置 接口 方法 客户 文件 线程 客户端 对象 框架 源码 结构 设计模式 设计 关键 内容 就是 时候 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 微软 数据库 产品经理 上海车凡网络技术有限公司 关系数据库基础期末考试 科技 互联网 怀念 纸质 升级服务器还需要安装系统吗 大镖客2 中文数据库 安宁软件开发网上价格 ftp未发送任何数据库 关系型数据库最大的特点是什么 企业软件开发月报范文30篇 mr软件开发造价估算参考 王者爆满服务器能登陆吗 qq邮箱的发送服务器 战地一怎么在局内看服务器名字 通信模组和服务器关系 主流网络安全设备都有啥 博士论文查重数据库有哪些 广州弘网络技术有限公司 数据库大师初级 黑客攻击服务器需要连接么 教育软件开发在哪里学 java读取数据库表的名字 明日之后服务器崩溃图片 计算机网络技术网络营销方法 pg数据库是哪家公司 网络技术保障方面 网络安全点击劫持问卷星 下列不会有网络安全隐患的 网络安全靶场什么意思 我的世界怎么用指令弄坏服务器
0