Java设计模式:责任链

上一篇 / 下一篇  2012-10-10 13:59:09 / 个人分类:Java

51Testing软件测试网\#|6~7_!T%j?9`

  责任链模式(Chain of Responsibility)的目标是使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。51Testing软件测试网AUA_)N&ybg*n

5ksoIe*sP;Y#L0  在处理用户的请求时可能要根据不同的情况对请求添加不同的处理逻辑,在这时候就可以利用责任链进行设计。当需要添加一个处理逻辑时可以很方便的添加一个处理的节点。

bH'S8Ni+{;w0

\#}r3];P/EN'|Ua;?)_0  现在我们的需求是处理用户的请求,将用户提交的字符串信息进行层层处理,同时在处理完成之后返回结果时,也要对返回的字符串进行层层处理,而处理返回的情况时其处理的顺序和先前是正好相反的顺序。51Testing软件测试网NFsih|

]5@1X}/mXg y0  首先建立用户的请求和接收对象Request和Response:

*}N rLe q;m0
  1. packagecom.lcq.filter;

  2. a5rI tX-N0
  3. publicclassRequest {
  4. String requestStr;
  5. 51Testing软件测试网x*WF F)r+`5EV)}s5v/sx
  6. publicString getRequestStr() {
  7. returnrequestStr;
  8. }

  9. +q){~ gY0
  10. publicvoidsetRequestStr(String requestStr) {
  11. this.requestStr = requestStr;
  12. }

  13. ]-m;pU-E;E'sN-]0
  14. }
  1. packagecom.lcq.filter;
  2. 51Testing软件测试网];a/I \5hL8}
  3. publicclassResponse {
  4. String responseStr;
  5. 51Testing软件测试网 z3r$?!nn^k7v
  6. publicString getResponseStr() {
  7. returnresponseStr;
  8. }
  9. 51Testing软件测试网&thwA {+jk
  10. publicvoidsetResponseStr(String responseStr) {
  11. this.responseStr = responseStr;
  12. }
  13. 51Testing软件测试网:k:H(iI,pk{
  14. }
51Testing软件测试网/f*b ?B,Z W,Y4i5O

  我们将处理用户信息的逻辑抽象成为一个个的过滤器,进一步抽象出过滤器接口Filter:

r\S)S-]8t"v0
  1. packagecom.lcq.filter; 

  2. $TR9u%Pf ^T*r8o&]&T0
  3. publicinterfaceFilter { 
  4.    publicvoiddoFilter(Request request, Response response,FilterChain chain); 

  5. ]'H5a$UMw0
  6. }
51Testing软件测试网v6Kp%yu

  注意在Filte接口中doFilter方法参数中有FilterChain的一个变量,我们再建立FilterChain类:

3RX"N5bWKyH l0
  1. packagecom.lcq.filter; 

  2. ?n-^N)dV0
  3. importjava.util.ArrayList; 
  4. importjava.util.List; 
  5. 51Testing软件测试网`%a2Yw5S+Z3]
  6. publicclassFilterChainimplementsFilter { 
  7.     List<Filter> filters =newArrayList<Filter>(); 
  8.    intindex =0

  9. ;N(} mt!v:]M8W0
  10.    publicFilterChain addFilter(Filter f) { 
  11.        this.filters.add(f); 
  12.        returnthis
  13.     } 
  14. 51Testing软件测试网:IJ,Yot(P
  15.    @Override
  16.    publicvoiddoFilter(Request request, Response response, FilterChain chain) { 
  17.        if(index == filters.size()) 
  18.            return
  19.         Filter f = filters.get(index); 
  20.         index++; 
  21.         f.doFilter(request, response, chain); 
  22.     } 
  23. }
  24. 51Testing软件测试网s:`W[+U6e

    "O)O4`KV0  在FilterChain中继承了Filter接口,从而实现了doFilter方法,在FilterChain中又有一个index变量,该 变量是用来标记当前访问的是哪一个过滤器,这些过滤器是存放在ArrayList中的,这样用户在使用的时候就可以实现自己的过滤器,编写自己的处理逻 辑,从而将自己的过滤器添加到ArrayList中,再调用FilterChain的doFilter方法遍历整个责任链。

    _-U.etd5BK$}5}051Testing软件测试网+],b$R#oI#Y}

      下面我们编写三个过滤器:51Testing软件测试网 FuS6R+y L s

    51Testing软件测试网!V6Vi@T#Zp \&];B~I!u

      HTMLFilter类:51Testing软件测试网8I J/IH2J7[^)VI

    51Testing软件测试网/b0_;VoPhHy:_ T

    Zo5}9bJ0
    1. packagecom.lcq.filter; 
    2. 51Testing软件测试网;Y8x"b:u'FJ"lP
    3. /**
    4. * 过滤HTML中的脚本元素
    5. * @author lcq
    6. *
    7. */
    8. publicclassHTMLFilterimplementsFilter { 

    9. 1|2k,Hjeld f%J-LJ0
    10.    @Override
    11.    publicvoiddoFilter(Request request, Response response,FilterChain chain) { 
    12.         request.requestStr = request.getRequestStr().replace("<","["
    13.                 .replace(">","] --------HTMLFilter"); 
    14.         chain.doFilter(request, response, chain); 
    15.         response.responseStr +="--------HTMLFilter"
    16.          
    17.     } 
    18. 51Testing软件测试网j[}JNM@P_5~R!H
    19. }
    51Testing软件测试网^,N4NL5Mo

      SesitiveFilter类:

    [ z@;hT8d,a?051Testing软件测试网 rk%n1|P

    51Testing软件测试网Q v2q9oV{6Ny

    1. packagecom.lcq.filter; 
    2. 51Testing软件测试网:SS[lk&uTo0Y{S
    3. publicclassSesitiveFilterimplementsFilter { 
    4. 51Testing软件测试网,i:T4Y%@?-w Ct
    5.    @Override
    6.    publicvoiddoFilter(Request request, Response response, FilterChain chain) { 
    7.         request.requestStr = request.getRequestStr().replace("敏感","  "
    8.                 .replace("猫猫","haha------SesitiveFilter"); 
    9.         chain.doFilter(request, response, chain); 
    10.         response.responseStr +="------SesitiveFilter"
    11. 51Testing软件测试网 h^:x;z {i4}
    12.     } 

    13. {:@$d v4|;K(NB0
    14. }
    51Testing软件测试网R;X$M g;`q$? |

      FaceFilter类:51Testing软件测试网"k;t/Y9l4P*i'Ba.p!lWN

    51Testing软件测试网"tPV bF/s#b7B?%}

    wOY S'A#r}0
    1. packagecom.lcq.filter; 

    2. ol~ [4A8@$X/N0
    3. publicclassFaceFilterimplementsFilter { 
    4. 51Testing软件测试网`y0Ox4_0dA
    5.    @Override
    6.    publicvoiddoFilter(Request request, Response response, FilterChain chain) { 
    7.         request.requestStr = request.getRequestStr().replace(":)"
    8.                "^V^-------FaceFilter"); 
    9.         chain.doFilter(request, response, chain); 
    10.         response.responseStr +="-------FaceFilter"

    11. +N/x;} N\/A0
    12.     } 
    13. 51Testing软件测试网4A g^+J;cM-\
    14. }

    &b0t R ~h0zr&d0  最后编写测试类:

    p7pr9c b!o v/v;]051Testing软件测试网-Z rx4yQ

    51Testing软件测试网;h/w p^&O-V

    1. packagecom.lcq.filter; 

    2. 7l#a Oo$a0\*G0
    3. publicclassMain { 
    4.    publicstaticvoidmain(String[] args) { 
    5. String message ="敏感词汇,重庆,<script> 躲猫猫 :)"
    6. Request request =newRequest(); 
    7.         request.setRequestStr(message); 
    8.         Response response =newResponse(); 
    9.         response.setResponseStr("response"); 
    10.         FilterChain fc =newFilterChain(); 
    11.         fc.addFilter(newHTMLFilter()).addFilter(newSesitiveFilter()); 

    12. sx\~8[!c'xm3Ej0
    13.         FilterChain fc2 =newFilterChain(); 
    14.         fc2.addFilter(newFaceFilter()); 
    15.         fc.addFilter(fc2); 
    16.         fc.doFilter(request, response,fc); 
    17.         System.out.println("request = "+ request.getRequestStr()); 
    18.         System.out.println("response = "+ response.getResponseStr()); 
    19.     } 

    20. O y*Av(CV1uO0C0
    21. }

    Fp5y{0\0  在上面的实例中应该注意两个地方:51Testing软件测试网;H |lD{ {

    51Testing软件测试网p1N8t&yC9Rg

      1、我们建立的FilterChain中继承了Filter接口,所以在测试类中就可以像使用其他的过滤器一样使用FilterChain,大大提高了灵活性;51Testing软件测试网6W\;u`/L(P6yNA7V

    51Testing软件测试网;sMY~6UfpAL

      2、对于实现责任链的访问处理顺序问题,该问题的解决使用的是递归的思想,从而使先调用的结点在处理返回结果时其调用过滤器的顺序是相反的。这种解决方案在Struts和其他框架中实现过滤器和拦截器使用的较为普遍,并且十分巧妙。51Testing软件测试网.z\'u#K/stq\pM


TAG:

 

评分:0

我来说两句

Open Toolbar