SpringMVC中的适配器模式
目录
一、适配器模式在SpringMVC框架应用的源码剖析
1、SpringMVC中的HandlerAdapter使用了适配器模式;
2、使用HandlerAdapter的原因分析
在SpringMVC可以看到处理器的类型不同,处理请求的方式也不同,有多重实现方式,那么调用方式就不是确定的,如果需要直接调用controller方法,需要调用的时候就得不断使用ifelse来进行判断是哪一种子类然后执行。那么如果后面要扩展controller,就得修改原来的代码,违背了开闭原则。
3、SpringMVC通过适配器模式获取对应的controller步骤
Spring定义了一个适配接口,使得每一种controller有一种对应的适配器实现类;适配器代替controller执行相应的方法,扩展controller时,只需要增加一个适配器类就完成了SpringMVC的扩展;
二、模拟适配器的应用
三种处理器
public class AnnotationHandler {
private static final Logger logger = LoggerFactory.getLogger(AnnotationHandler.class);
public void doAnnotationHandle(){
logger.info("处理Annotation请求");
}
}
public class HttpHandler {
private static final Logger logger = LoggerFactory.getLogger(HttpHandler.class);
public void doHandle(){
logger.info("处理http请求");
}
}
public class SimpleHandler {
private static final Logger logger = LoggerFactory.getLogger(SimpleHandler.class);
public void doSimpleHandle(){
logger.info("处理simple请求");
}
}
适配器接口
public interface HandlerAdapter {
boolean supports(Object handler);
void handle(Object handler);
}
适配器对于三种不同处理器的适配
public class AnnotationAdapter implements HandlerAdapter {
@Override
public boolean supports(Object handler) {
return handler instanceof AnnotationHandler;
}
@Override
public void handle(Object handler) {
AnnotationHandler annotationController = (AnnotationHandler) handler;
annotationController.doAnnotationHandle();
}
}
public class HttpAdapter implements HandlerAdapter {
@Override
public boolean supports(Object handler) {
return handler instanceof HttpHandler;
}
@Override
public void handle(Object handler) {
HttpHandler httpController = (HttpHandler) handler;
httpController.doHandle();
}
}
public class SimpleAdapter implements HandlerAdapter {
@Override
public boolean supports(Object handler) {
return handler instanceof SimpleHandler;
}
@Override
public void handle(Object handler) {
SimpleHandler simpleController = (SimpleHandler) handler;
simpleController.doSimpleHandle();
}
}
CustomDispatchServlet测试
public class CustomDispatchServlet {
private final List<HandlerAdapter> handlerList = new ArrayList<>(10);
public CustomDispatchServlet() {
handlerList.add(new AnnotationAdapter());
handlerList.add(new HttpAdapter());
handlerList.add(new SimpleAdapter());
}
public void doDispatch(){
HttpHandler httpController = new HttpHandler();
HandlerAdapter handler = getHandler(httpController);
handler.handle(httpController);
}
public HandlerAdapter getHandler(Object handler) {
for (HandlerAdapter currentHanler : handlerList) {
if (currentHanler.supports(handler)) {
return currentHanler;
}
}
return null;
}
public static void main(String[] args) {
CustomDispatchServlet customDispatchServlet = new CustomDispatchServlet();
customDispatchServlet.doDispatch();
}
}
打印效果:
11:49:55.292 [main] INFO com.guang.javadesign.adapter.handler.HttpController - 处理http请求
三、分析适配器
3.1、概念
Adapter适配器模式,将一个类的接口转换成客户希望的另外一个接口。使原本由于接口不兼容而不能一起工作的那些类可以一起工作了。
3.2、适用场景
1、已经存在的类的方法和需求不匹配(方法结果相同或类似)的情况。
2、适配器模式不是软件初始阶段考虑的设计模式,是随着软件的发展,由于不同产品、不同厂家造成功能类似而接口不同的问题的解决方案。
优缺点
1、优点
- 可以让任何两个没有关联的类一起运行;
- 增加了类的透明性;
- 提高了类的复用度;
- 灵活性非常好;
2、缺点
- 过多使用适配器会使系统非常凌乱;
- 由于java是单继承的,所以只能适配一个适配器类,而且目标类必须是抽象的;
- 只有碰到无法改变原有设计和代码的情况下,才会考虑适配器模式;
从理论中来,到实践中去,最终回归理论