责任链模式----ChainOfResponsibility

来源:互联网 发布:mac图片怎么保存 编辑:程序博客网 时间:2024/06/01 10:04
意图:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,
并且沿着这条链传递请求,直到有对象处理它为止
主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处
理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了
什么时候使用:在处理消息的时候以过滤很多道
如何解决 :拦截的类都实现统一接口

应用实例:1、红楼梦中的“击鼓传花”2、JS中的事件冒泡 3、JAVA WEB中 Apache Tomcat 的对Encoding的 处理,
Struts2 的拦截器, jsp servlet 的Filte
  1. package com.bjsxt.dp.filter;public interface Filter {void doFilter(Request request, Response response, FilterChain chain);}

    package com.bjsxt.dp.filter;public class Request {String requestStr;public String getRequestStr() {return requestStr;}public void setRequestStr(String requestStr) {this.requestStr = requestStr;}}

    package com.bjsxt.dp.filter;public class Response {String responseStr;public String getResponseStr() {return responseStr;}public void setResponseStr(String responseStr) {this.responseStr = responseStr;}}

    package com.bjsxt.dp.filter;import java.util.ArrayList;import java.util.List;public class FilterChain implements Filter {List<Filter> filters = new ArrayList<Filter>();int index = 0;public FilterChain addFilter(Filter f) {this.filters.add(f);return this;}@Overridepublic void doFilter(Request request, Response response, FilterChain chain) {if(index == filters.size()) return ;Filter f = filters.get(index);index ++;f.doFilter(request, response, chain);}}

    package com.bjsxt.dp.filter;public class HTMLFilter implements Filter {@Overridepublic void doFilter(Request request, Response response, FilterChain chain) {//process the html tag <>request.requestStr = request.requestStr.replace('<', '[')   .replace('>', ']') + "---HTMLFilter()";chain.doFilter(request, response, chain);response.responseStr += "---HTMLFilter()";}}

    package com.bjsxt.dp.filter;public class SesitiveFilter implements Filter {@Overridepublic void doFilter(Request request, Response response, FilterChain chain) {request.requestStr = request.requestStr.replace("被就业", "就业") .replace("敏感", "") + "---SesitiveFilter()";chain.doFilter(request, response, chain);response.responseStr += "---SesitiveFilter()";}}

  2. package com.bjsxt.dp.filter;public class Main {/** * @param args */public static void main(String[] args) {String msg = "大家好:),<script>,敏感,被就业,网络授课没感觉,因为看不见大家伙儿";Request request = new Request();request.setRequestStr(msg);Response response = new Response();response.setResponseStr("response");FilterChain fc = new FilterChain();fc.addFilter(new HTMLFilter())  .addFilter(new SesitiveFilter());fc.doFilter(request, response, fc);System.out.println(request.getRequestStr());System.out.println(response.getResponseStr());}}



0 0
原创粉丝点击