Java设计模式---ChainOfResponsibility责任链模式
程序员文章站
2022-03-20 20:09:03
参考于 : 大话设计模式 马士兵设计模式视频 代码参考于马士兵设计模式视频 写在开头:职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系 图来自大话设计模式,下面我的代码中,Clien是t依赖于Handler1和Handler2的,不过可以使用配置文件或者直接给Fil ......
参考于 :
大话设计模式
马士兵设计模式视频
代码参考于马士兵设计模式视频
写在开头:职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系
图来自大话设计模式,下面我的代码中,clien是t依赖于handler1和handler2的,不过可以使用配置文件或者直接给filter集合初始化来解决这种依赖。
1.场景
在网上评论一句话,往往会经过一系列的处理,有没有敏感词之类,现在我们来模拟一下。
把<html>,o.o,和谐
换成 [html],^v^,/*河蟹*/
2.不使用职责链模式
package com.dingyu.chainofresponsibility; /** * 重点在于模式,故逻辑暂时不考虑 * * @author dingyu * */ public class client01 { public static void main(string[] args) { string s = "<html>,o.o,和谐"; s = s.replace("<", "[").replace(">", "]").replace("和谐", "/*河蟹*/").replace("o.o", "^v^"); system.out.println(s); } }
缺点:过滤无法复用,无法记录过滤顺序。
3.使用职责链模式
package com.dingyu.chainofresponsibility; /** * 过滤器,dofilter处理msg字符串 * @author dingyu * */ public interface filter { public string dofilter(string msg); }
package com.dingyu.chainofresponsibility; /** * 处理html符号 * 测试用的,逻辑不是很严谨 * @author dingyu * */ public class htmlfilter implements filter { @override public string dofilter(string msg) { return msg.replace("<", "[").replace(">", "]"); } }
package com.dingyu.chainofresponsibility; /** * 过滤敏感词汇 * @author dingyu * */ public class sensitivewordfilter implements filter { @override public string dofilter(string msg) { return msg.replace("和谐", "/*河蟹*/"); } }
package com.dingyu.chainofresponsibility; /** * 处理符号 * @author dingyu * */ public class symbolfilter implements filter { @override public string dofilter(string msg) { return msg.replace("o.o", "^v^"); } }
package com.dingyu.chainofresponsibility; import java.util.arraylist; import java.util.list; public class client { private static list<filter> filters = new arraylist<filter>(); private static int index = 0; public static void main(string[] args) { string s = "<html>,o.o,和谐"; filters.add(new htmlfilter()); filters.add(new symbolfilter()); filters.add(new sensitivewordfilter()); for (filter filter : filters) { s = filter.dofilter(s); } system.out.println(s); } }
虽然使用职责链模式,但仍然有缺点,上面的顺序是先html,然后symbol,最后sensitiveword,这三个构成一个过滤链条,如果有一天我需要把另一个过滤链条插入到这根链条中间,实现起来很麻烦。
4.改进职责链模式
package com.dingyu.chainofresponsibility; import java.util.arraylist; import java.util.list; /** * * @author dingyu * */ public class filterchain implements filter { private list<filter> filters = new arraylist<filter>(); public void add(filter filter) { filters.add(filter); } public list<filter> getfilters() { return filters; } @override public string dofilter(string msg) { for (filter filter : filters) { msg = filter.dofilter(msg); } return msg; } }
package com.dingyu.chainofresponsibility; import java.util.arraylist; import java.util.list; public class client { // private static list<filter> filters = new arraylist<filter>(); public static void main(string[] args) { string s = "<html>,o.o,和谐"; // 链条1 filterchain chain1 = new filterchain(); chain1.add(new htmlfilter()); // 链条2 filterchain chain2 = new filterchain(); chain2.add(new htmlfilter()); chain2.add(new sensitivewordfilter()); // 链条2插到链条1后 chain1.add(chain2); chain1.add(new symbolfilter()); s = chain1.dofilter(s); system.out.println(s); // filters.add(new htmlfilter()); // filters.add(new symbolfilter()); // filters.add(new sensitivewordfilter()); // for (filter filter : filters) { // s = filter.dofilter(s); // } // system.out.println(s); } }
建议debug , eclipse快捷键
5. 职责链实现双向过滤
思路类似于递归,建议使用debug一步步调试。
package com.dingyu.chainofresponsibility; /** * 过滤器,dofilter处理msg字符串 * * @author dingyu * */ public interface filter { // public string dofilter(string msg); public void dofilter(request request, reponse reponse, filterchain filterchain); }
package com.dingyu.chainofresponsibility; /** * 处理html符号 测试用的,逻辑不是很严谨 * * @author dingyu * */ public class htmlfilter implements filter { @override public void dofilter(request request, reponse reponse, filterchain filterchain) { request.getrequestmsg().replace("<", "[").replace(">", "]"); filterchain.dofilter(request, reponse, filterchain); reponse.setreponsemsg(reponse.getreponsemsg() + "-----htmlfilter"); } // @override // public string dofilter(string msg) { // return msg.replace("<", "[").replace(">", "]"); // } }
package com.dingyu.chainofresponsibility; /** * 过滤敏感词汇 * * @author dingyu * */ public class sensitivewordfilter implements filter { @override public void dofilter(request request, reponse reponse, filterchain filterchain) { request.getrequestmsg().replace("和谐", "/*河蟹*/"); filterchain.dofilter(request, reponse, filterchain); reponse.setreponsemsg(reponse.getreponsemsg() + "-----sensitivewordfilter"); } // @override // public string dofilter(string msg) { // return msg.replace("和谐", "/*河蟹*/"); // } }
package com.dingyu.chainofresponsibility; /** * 处理符号 * * @author dingyu * */ public class symbolfilter implements filter { @override public void dofilter(request request, reponse reponse, filterchain filterchain) { request.getrequestmsg().replace("o.o", "^v^"); filterchain.dofilter(request, reponse, filterchain); reponse.setreponsemsg(reponse.getreponsemsg() + "-----symbolfilter"); } // @override // public string dofilter(string msg) { // return msg.replace("o.o", "^v^"); // } }
package com.dingyu.chainofresponsibility; import java.util.arraylist; import java.util.list; /** * * @author dingyu * */ public class filterchain implements filter { private list<filter> filters = new arraylist<filter>(); private int index=-1; public void add(filter filter) { filters.add(filter); } public list<filter> getfilters() { return filters; } // @override // public string dofilter(string msg) { // for (filter filter : filters) { // msg = filter.dofilter(msg); // } // return msg; // } @override public void dofilter(request request, reponse reponse, filterchain filterchain) { if (index == filters.size()-1) return; index++; filters.get(index).dofilter(request, reponse, filterchain); } }
package com.dingyu.chainofresponsibility; public class client03 { public static void main(string[] args) { request request = new request(); reponse reponse = new reponse(); request.setrequestmsg("<html>,o.o,和谐"); reponse.setreponsemsg("hahahahaha"); filterchain chain = new filterchain(); chain.add(new htmlfilter()); chain.add(new sensitivewordfilter()); chain.add(new symbolfilter()); chain.dofilter(request, reponse, chain); system.out.println(request.getrequestmsg()); system.out.println(reponse.getreponsemsg()); } }