写点什么

【源码分析设计模式 10】SpringMVC 中的适配器模式

  • 2021 年 11 月 11 日
  • 本文字数:2093 字

    阅读完需:约 7 分钟

}

4、ConcreteTarget

package designMode.adapter.sxn;


public class ConcreteTarget implements Target {


@Override


public void request() {


System.out.println("普通请求");


}


}

5、测试类

package designMode.adapter.sxn;


public class Client {


public static void main(String[] args) {


//原有业务逻辑


Target target = new ConcreteTarget();


target.request();


//增加适配器后的业务逻辑


Target target2 = new Adapter();


target2.request();


}


}

6、控制台输出


六、对象适配器




通过对象层次的关联关系进行委托(对象的合成关系/关联关系)。UML 结构图如下:


1、Target

客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。


package designMode.adapter.sxn;


public class Target {


public void request() {


System.out.println("普通请求");


}


}

2、Adaptee

需要适配的类。


package designMode.adapter.sxn;


public class Adaptee {


public void specificRequest() {


System.out.println("特殊请求");


}


}

3、Adapter

通过在内部包装一个 Adaptee 对象,把源接口转换成目标接口。


package designMode.adapter.sxn;


public class Adapter extends Target{


private Adaptee adaptee = new Adaptee();


@Override


public void request() {


adaptee.specificRequest();


}


}

4、测试类

package designMode.adapter.sxn;


public class Client {


public static void main(String[] args) {


Target target = new Adapter();


target.request();


}


}

5、控制台输出


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



1、SpringMVC 中的 HandlerAdapter 使用了适配器模式;

2、使用 HandlerAdapter 的原因分析

可以看到处理器的类型不同,有多重实现方式,那么调用方式就不是确定的,如果需要直接调用 controller 方法,需要调用的时候就得不断使用 ifelse 来进行判断是哪一种子类然后执行。那么如果后面要扩展 controller,就得修改原来的代码,违背了开闭原则。

3、SpringMVC 通过适配器模式获取对应的 controller 步骤

  • Spring 定义了一个适配接口,使得每一种 controller 有一种对应的适配器实现类;

  • 适配器代替 controller 执行相应的方法

  • 扩展 controller 时,只需要增加一个适配器类就完成了 SpringMVC 的扩展;

4、模拟代码实现


  • ?controller 接口


package com.guor.adapter;


public interface Controller {


}


class HttpController implements Controller {


public void doHttpHandler() {


System.out.println("http...");


}


}


class SimpleController implements Controller {


public void doSimplerHandler() {


System.out.println("simple...");


}


}


class AnnotationController implements Controller {


public void doAnnotationHandler() {


System.out.println("annotation...");


}


}


HandlerAdapter 接口


package com.guor.adapter;


public interface HandlerAdapter {


public boolean supports(Object handler);


public void handle(Object handler);


}


// 多种适配器类


class SimpleHandlerAdapter implements HandlerAdapter {


public void handle(Object handler) {


((SimpleController) handler).doSimplerHandler();


}


public boolean supports(Object handler) {


return (handler instanceof SimpleController);


}


}


class HttpHandlerAdapter implements HandlerAdapter {


public void handle(Object handler) {


((HttpController) handler).doHttpHandler();


}


public boolean supports(Object handler) {


return (handler instanceof HttpController);


}


}


class AnnotationHandlerAdapter implements HandlerAdapter {


public void handle(Object handler) {


((AnnotationController) handler).doAnnotationHandler();


}


public boolean supports(Object handler) {


return (handler instanceof AnnotationController);


}


}


DispatchServlet 类


package com.guor.adapter;


import java.util.ArrayList;


import java.util.List;


public class DispatchServlet {


public static List<HandlerAdapter> handlerAdapters = new ArrayList<HandlerAdapter>();


public DispatchServlet() {


handlerAdapters.add(new AnnotationHandlerAdapter());


handlerAdapters.add(new HttpHandlerAdapter());


handlerAdapters.add(new SimpleHandlerAdapter());


}


public void doDispatch() {


// 此处模拟 SpringMVC 从 request 取 handler 的对象,


// 适配器可以获取到希望的 Controller


HttpController controller = new HttpController();


// AnnotationController controller = new AnnotationController();


//SimpleController controller = new SimpleController();


// 得到对应适配器


HandlerAdapter adapter = ge


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


tHandler(controller);


// 通过适配器执行对应的 controller 对应方法


adapter.handle(controller);


}


public HandlerAdapter getHandler(Controller controller) {


//遍历:根据得到的 controller(handler), 返回对应适配器


for (HandlerAdapter adapter : this.handlerAdapters) {


if (adapter.supports(controller)) {


return adapter;

评论

发布
暂无评论
【源码分析设计模式 10】SpringMVC中的适配器模式