前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java设计模式之责任链模式,一个也不能少,每个人都是主角

java设计模式之责任链模式,一个也不能少,每个人都是主角

作者头像
用户4361942
发布2019-05-24 16:59:23
3260
发布2019-05-24 16:59:23
举报
文章被收录于专栏:java程序员思维java程序员思维

责任链模式

责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。

责任链模式解决的问题

避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到所有对象处理它为止。

使用场景

对请求参数进行防xss攻击处理,敏感词替换,如“佣金”是敏感词,需要替换成***,防止xss攻击,将<替换成<,将>替换成&gt。请求参数“测试佣金,<script>,关注java程序员思维”经过转换得到的结果是“测试***,<script>,关注java程序员思维”。

1. 不使用任何模式

代码语言:javascript
复制
<dependency>
 <groupId>com.google.guava</groupId>
 <artifactId>guava</artifactId>
 <version>18.0</version>
</dependency>

guava提供了一个放xss攻击的工具类,引入guava的jar包。

代码语言:javascript
复制
public class NoMode { private static final Escaper XSS= HtmlEscapers.htmlEscaper(); public static void main(String[] args) { System.out.println("替换前"); String request = "测试佣金,<script>,关注java程序员思维"; System.out.println(request); System.out.println("--------------------"); request = dealRequest(request); System.out.println("替换后"); System.out.println(request); }public static String dealRequest(String request){ request = request.replaceAll("佣金","***"); request = XSS.escape(request); return request; }}

运行结果:

2. 使用策略模式:

代码语言:javascript
复制
public interface Strategy { public String dealRequest(String request);}public class XssStrategy implements Strategy { private static final Escaper XSS = HtmlEscapers.htmlEscaper(); @Override public String dealRequest(String request) { return XSS.escape(request); }}public class SensitiveStrategy implements Strategy { @Override public String dealRequest(String request) { return request.replaceAll("佣金", "***"); }}public class SensitiveStrategy implements Strategy { @Override public String dealRequest(String request) { return request.replaceAll("佣金", "***"); }}public class Client { private Strategy strategy;  public Client(Strategy strategy) { this.strategy = strategy; } public void setStrategy(Strategy strategy) { this.strategy = strategy; } public String dealRequest(String request){ return strategy.dealRequest(request); }}public class Test { public static void main(String[] args) { String request = "测试佣金,<script>,关注java程序员思维"; System.out.println("request: " + request); Strategy strategy = new XssStrategy(); Client client = new Client(strategy); request = client.dealRequest(request); client.setStrategy(new SensitiveStrategy()); request = client.dealRequest(request); System.out.println("最终结果:" + request); }}

运行结果:

对于所有的算法都要执行一遍,使用策略模式,客户端的代码可以改造一下,维护一个Strategy集合。

代码语言:javascript
复制
public class ClientOptimize { private List<Strategy> list = new ArrayList<Strategy>(); public ClientOptimize addStrategy(Strategy strategy){ list.add(strategy); return this; } public String dealRequest(String request){ for(Strategy strategy : list){ request = strategy.dealRequest(request); } return request; }}public class ClientOptimizeTest { public static void main(String[] args) { String request = "测试佣金,<script>,关注java程序员思维"; System.out.println("request: " + request); ClientOptimize clientOptimize = new ClientOptimize(); request = clientOptimize.addStrategy(new XssStrategy()).addStrategy(new SensitiveStrategy()).dealRequest(request); System.out.println("最终结果:" + request); }}

运行结果:

3.使用责任链模式

代码语言:javascript
复制
public class Request { private String requestValue; public Request(String requestValue) { this.requestValue = requestValue; } public String getRequestValue() { return requestValue; } public void setRequestValue(String requestValue) { this.requestValue = requestValue; }}public class Response { private String responseValue; public Response(){} public Response(String responseValue) { this.responseValue = responseValue; } public String getResponseValue() { return responseValue; } public void setResponseValue(String responseValue) { this.responseValue = responseValue; }}public interface Filter { void doFilter(Request request,Response response,FilterChain chain);}public class XssFilter implements Filter{ private static final Escaper XSS= HtmlEscapers.htmlEscaper(); @Override public void doFilter(Request request, Response response, FilterChain chain) { System.out.println("xssFilter 开始执行"); request.setRequestValue(XSS.escape(request.getRequestValue())); chain.doFilter(request,response,chain); System.out.println("xssFilter 执行完毕"); } public static void main(String[] args) { System.out.println(XSS.escape("<script>,dfsafdsa")); }}public class SensitiveFilter implements Filter{ @Override public void doFilter(Request request, Response response, FilterChain chain) { System.out.println("SensitiveFilter 开始执行"); request.setRequestValue(replaceSensitive(request.getRequestValue())); chain.doFilter(request,response,chain); System.out.println("SensitiveFilter 执行完毕"); } public String replaceSensitive(String value){ return value.replaceAll("佣金","***"); }}public class FilterChain implements Filter { private List<Filter> filters = new ArrayList<Filter>(); private int index = 0; public FilterChain addFilter(Filter filter) { filters.add(filter); return this; } public void doFilter(Request request, Response response, FilterChain chain) { if (index == filters.size()) { response.setResponseValue(request.getRequestValue()); return; } Filter filter = filters.get(index); index++; filter.doFilter(request, response, chain); }}public class Test { public static void main(String[] args) { Request request = new Request("测试佣金,<script>,关注java程序员思维"); System.out.println("request:" + request.getRequestValue()); Response response = new Response(); FilterChain filterChain = new FilterChain(); filterChain.addFilter(new XssFilter()).addFilter(new SensitiveFilter()); filterChain.doFilter(request,response,filterChain); System.out.println("最终结果:" + response.getResponseValue()); }}

运行结果:

优缺点

优点:1、降低耦合度 2、简化了对象。 3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。

缺点:责任链太长或者每条链判断处理的时间太长会影响性能,特别是递归循环的时候。

生活中的责任链模式

生活中流水线就有点像责任链模式,比如去食堂吃饭,第一个阿姨负责打饭,第二个阿姨负责蔬菜,第三个阿姨负责打荤菜,第四个阿姨负责收钱,每个排队吃饭的人,都需要经过4个阿姨的处理,你可以有选择性过滤,可以跳过蔬菜或者荤菜,但是不能跳过收钱的阿姨,否则会被当做吃霸王餐,被痛打一顿。其他的流水线也类似,生产鞋、手机、汽车,每个人都负责其中的某一个部分,每一道工序都要严格把关,才能生产出合格的产品。

我的启发

责任链模式就像流水线,每个人都负责其中一道工序,完整的工序才能创造出完美的产品,每个人都扮演着重要的角色,一个也不能少。每个人都在演一部电影,这部电影叫作人生,每个人都是自己电影中的主角。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java程序员思维 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档