SpringMVC适配器模式代码示例

2025-05-27 0 63

此处采用了适配器模式, 由于Controller的类型不同,有多重实现方式,那么调用方式就不是确定的,如果需要直接调用Controller方法,需要在代码中写成如下形式:

?

1

2

3

4

5

6

7
if(mappedHandler.getHandler() instanceof MultiActionController){

((MultiActionController)mappedHandler.getHandler()).xxx

}else if(mappedHandler.getHandler() instanceof XXX){

...

}else if(...){

...

}

这样假设如果我们增加一个HardController,就要在代码中加入一行 if(mappedHandler.getHandler() instanceof HardController)
这种形式就使得程序难以维护,也违反了设计模式中的开闭原则 — 对扩展开放,对修改关闭。

因此Spring定义了一个适配接口,使得每一种Controller有一种对应的适配器实现类,
让适配器代替controller执行相应的方法。这样在扩展Controller 时,只需要增加一个适配器类就完成了SpringMVC的扩展了,真的是很精巧的做法!

废话不多说还是上代码吧,为了看得清楚,就自己实现一套代码来模拟springMVC, 直接贴Spring源码容易降低关注点。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81
//定义一个Adapter接口

public interface HandlerAdapter {

public Boolean supports(Object handler);

public void handle(Object handler);

}

//以下是三种Controller实现

public interface Controller {

}

public class HttpController implements Controller{

public void doHttpHandler(){

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

}

}

public class SimpleController implements Controller{

public void doSimplerHandler(){

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

}

}

public class AnnotationController implements Controller{

public void doAnnotationHandler(){

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

}

}

//下面编写适配器类

public class SimpleHandlerAdapter implements HandlerAdapter {

public void handle(Object handler) {

((SimpleController)handler).doSimplerHandler();

}

public Boolean supports(Object handler) {

return (handler instanceof SimpleController);

}

}

public class HttpHandlerAdapter implements HandlerAdapter {

public void handle(Object handler) {

((HttpController)handler).doHttpHandler();

}

public Boolean supports(Object handler) {

return (handler instanceof HttpController);

}

}

public class AnnotationHandlerAdapter implements HandlerAdapter {

public void handle(Object handler) {

((AnnotationController)handler).doAnnotationHandler();

}

public Boolean supports(Object handler) {

return (handler instanceof AnnotationController);

}

}

//模拟一个DispatcherServlet

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的对象,仅仅new出,可以出,

//不论实现何种Controller,适配器总能经过适配以后得到想要的结果

// HttpController controller = new HttpController();

// AnnotationController controller = new AnnotationController();

SimpleController controller = new SimpleController();

//得到对应适配器

HandlerAdapter adapter = getHandler(controller);

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

adapter.handle(controller);

}

public HandlerAdapter getHandler(Controller controller){

for (HandlerAdapter adapter: this.handlerAdapters){

if(adapter.supports(controller)){

return adapter;

}

}

return null;

}

public static void main(String[] args){

new DispatchServlet().doDispatch();

}

}

通过这个模式可以看出开源代码中的精妙,我们在看框架源码时需要有目标的看,这样会找到很多自己需要学习的东西,目前很多分析源码的帖子大部分是讲解what,how,

以此来抛砖引玉,希望各位能够一起来讨论“why”

总结

以上就是本文关于SpringMVC适配器模式代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

原文链接:http://www.cnblogs.com/tongkey/p/7919401.html

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 SpringMVC适配器模式代码示例 https://www.kuaiidc.com/77164.html

相关文章

发表评论
暂无评论