【源码分析设计模式 10】SpringMVC 中的适配器模式
}
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
tHandler(controller);
// 通过适配器执行对应的 controller 对应方法
adapter.handle(controller);
}
public HandlerAdapter getHandler(Controller controller) {
//遍历:根据得到的 controller(handler), 返回对应适配器
for (HandlerAdapter adapter : this.handlerAdapters) {
if (adapter.supports(controller)) {
return adapter;
评论