描述
- 定义
责任链模式(Chain of Responsibility):避免请求发送者与接受者耦合在一起,让多个多些都有可能接受清收,将这些对象连成一条链,并且沿着这条链传递请求,指导有对象处理为止。
-
优点
1)让一个对象无须知道被哪一个对象处理其请求,对象仅需知道该请求会被处理即可,接受者和发送者都没有对方的明确信息,且链中的对象不需要知道链的结构,由客户端负责链的创建,降低系统的耦合度
2)请求处理对象仅需维持一个指向其链的引用,而不需要维持它对所有处理着的引用,可简化对象的相互连接
3)可以对该链动态的增加和修改处理一个请求的职责
4)在系统中添加一个新的具体处理者无须修改原有的系统的代码,只需要在客户端重新链的规则即可 -
缺点
1)请求没有明确的接收者,不能保证该请求一定会被处理,该请求可能一直到链的末端都得不到处理
2)对于比较长的责任链,请求的对象可能涉及到多个处理对象,系统性能将受到一定影响
3)创建链不当,可能造成循环调用,将导致系统陷入死循环
案例描述
博客留言系统中,服务器接收到客户端提交的留言字符串后,为防止客户端提交的html标签影响网站的正常展示或恶意注入代码影响服务器端的正常运行,需要对提交的字符串进行链式过滤,并且在返回的时候会对反回的数据按照链条的先进后出规则进行过滤处理展示。
代码实现(java)
-
Request和Response对象
public class Request { @Getter @Setter private String requestStr; } 复制代码
public class Response { @Getter @Setter private String responseStr; } 复制代码
-
过滤器接口:Filter
public interface Filter { void doFilter(Request request, Response response, FilterChain chain); } 复制代码
-
过滤器链:FilterChain 实现Filter方便过滤波器链添加
public class FilterChain implements Filter { private final List<Filter> filters = new ArrayList<Filter>(); int index = 0; public FilterChain addFilter(Filter filter) { this.filters.add(filter); return this; } public void doFilter(Request request, Response response, FilterChain chain) { if (index == filters.size()) { return; } Filter filter = filters.get(index++); filter.doFilter(request, response, chain); } } 复制代码
-
Filter实现类
HtmlFilterpublic class HtmlFilter implements Filter { public void doFilter(Request request, Response response, FilterChain chain) { request.setRequestStr(request.getRequestStr() + "-HtmlFilter-"); chain.doFilter(request, response, chain); response.setResponseStr(response.getResponseStr() + "-HtmlFilter-"); } } 复制代码
SesitiveFilter
public class SesitiveFilter implements Filter { public void doFilter(Request request, Response response, FilterChain chain) { request.setRequestStr(request.getRequestStr() + "-SesitiveFilter-"); chain.doFilter(request, response, chain); response.setResponseStr(response.getResponseStr() + "-SesitiveFilter-"); } } 复制代码
SqlInjectionFilter
public class SqlInjectionFilter implements Filter { public void doFilter(Request request, Response response, FilterChain chain) { request.setRequestStr(request.getRequestStr() + "-SqlInjectionFilter-"); chain.doFilter(request, response, chain); response.setResponseStr(response.getResponseStr() + "-SqlInjectionFilter-"); } } 复制代码
-
测试
public static void main(String[] args) { FilterChain fc1 = new FilterChain(); fc1.addFilter(new HtmlFilter()).addFilter(new SesitiveFilter()); FilterChain fc2 = new FilterChain(); fc2.addFilter(new SqlInjectionFilter()); fc1.addFilter(fc2); Request request = new Request(); request.setRequestStr("request"); Response response = new Response(); response.setResponseStr("response"); fc1.doFilter(request, response, fc1); System.out.println(request.getRequestStr()); System.out.println(response.getResponseStr()); } 复制代码
结果
request-HtmlFilter--SesitiveFilter--SqlInjectionFilter- response-SqlInjectionFilter--SesitiveFilter--HtmlFilter- 复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END