Chain of Responsibility责任链

Chain of Responsibility 责任链

Chain of Responsibility责任链 - 图1
责任链模式,举个例子就是servlet的Filter和FilterChain,泛型为Filter的list作为FilterChain的成员变量。相当于责任链上的每一个节点,每个过滤器都承担自己的责任,在FilterChain执行doFilter后过滤信息或者请求。

  1. public class Cor {
  2. public static void main(String[] args){
  3. Request request = new Request();
  4. request.str = "AABB";
  5. Response response = new Response();
  6. response.str = "response";
  7. FilterPart1 filterPart1 = new FilterPart1();
  8. FilterPart2 filterPart2 = new FilterPart2();
  9. FilterChain filterChain = new FilterChain();
  10. filterChain.add(filterPart1).add(filterPart2);
  11. filterChain.doFilter(request,response);
  12. System.out.println(request.str);
  13. System.out.println(response.str);
  14. }
  15. }
  16. interface Filter{
  17. void doFilter(Request req,Response res,FilterChain filterChain);
  18. }
  19. class Request{
  20. String str;
  21. }
  22. class Response{
  23. String str;
  24. }
  25. class FilterPart1 implements Filter{
  26. @Override
  27. public void doFilter(Request req, Response res, FilterChain filterChain) {
  28. req.str = req.str.replace('A','X');
  29. filterChain.doFilter(req,res);
  30. res.str+="FilterPart1";
  31. }
  32. }
  33. class FilterPart2 implements Filter{
  34. @Override
  35. public void doFilter(Request req, Response res, FilterChain filterChain) {
  36. req.str = req.str.replace('B','Z');
  37. filterChain.doFilter(req,res);
  38. res.str+="FilterPart2";
  39. }
  40. }
  41. class FilterChain{
  42. ArrayList<Filter> filters = new ArrayList<>();
  43. int index;
  44. public FilterChain add(Filter filter){
  45. filters.add(filter);
  46. return this;
  47. }
  48. public void doFilter(Request req,Response res){
  49. if(index<filters.size()){
  50. filters.get(index++).doFilter(req,res,this);
  51. }
  52. }
  53. }