参考于 :

  大话设计模式

  马士兵设计模式视频

  代码参考于马士兵设计模式视频

  写在开头:职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系

  图来自大话设计模式,下面我的代码中,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());
}
}

Java设计模式---ChainOfResponsibility责任链模式的更多相关文章

  1. 详解java设计模式之责任链模式

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt175 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次 ...

  2. Java设计模式之责任链模式、职责链模式

    本文继续介绍23种设计模式系列之职责链模式.   什么是链 1.链是一系列节点的集合. 2..链的各节点可灵活拆分再重组.   职责链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间 ...

  3. JAVA设计模式之责任链模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

  4. Java设计模式之八 ----- 责任链模式和命令模式

    前言 在上一篇中我们学习了结构型模式的享元模式和代理模式.本篇则来学习下行为型模式的两个模式, 责任链模式(Chain of Responsibility Pattern)和命令模式(Command ...

  5. Java设计模式应用——责任链模式

    生产一个产品,需要依次执行多个步骤,才能完成,那么是使用责任链模式则是极好的. 在性能告警模块开发过程中,创建一条告警规则需要执行阈值解析,中间表生成,流任务生成,规则入库,告警事件入库等诸多操作.如 ...

  6. java设计模式之责任链模式(Chain of Responsibility)

    转自:http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html 在阎宏博士的<JAVA与模式>一书中开头是这样 ...

  7. java设计模式之责任链模式以及在java中作用

    责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个 ...

  8. 击鼓传花联想到了Java设计模式:责任链模式

    目录 应用场景 简单示例 责任链模式 定义 意图 主要解决问题 何时使用 优缺点 击鼓传花的故事 应用场景 http web请求处理,请求过来后将经过转码.解析.参数封装.鉴权等一系列的处理(责任), ...

  9. 【java设计模式】责任链模式

    可以随时添加过滤器,并在主方法中添加删除: Main package com.tn.filter; public class Main { public static void main(String ...

随机推荐

  1. Git操作中crlf和lf冲突问题

    多人参与项目开发的时候,经常会遇到代码格式化不一致,在提交的时候出现很多冲突的情况.其中换行符冲突就是一种,在不同的系统平台上是不一样的.UNIX/Linux 使用的是 0x0A(LF),早期的 Ma ...

  2. redis测试实践

    最近测试服务端的时候,接触到了redis,之前也看过,但不系统,借着这次实践,记录一下. 一.写在前面 Redis是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的 ...

  3. Python动态绑定属性slots的使用

    当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.废话不多说,我们看一个例子: class Person(object): pass ...

  4. sublime text3快速生成html时,tab键失效

    sublime tab键失效

  5. Android 插件化技术窥探

    在Android 插件化技术中(宿主app和插件app设置相同的sharedUserId),动态加载apk有两种方式: 一种是将资源主题包的apk安装到手机上再读取apk内的资源,这种方式的原理是将宿 ...

  6. ABP项目依赖图,根据自已生在的Demo项目分析而得

    根据自已生在的Demo项目分析而得 在线学习代码库:https://github.com/AtwindYu/ABPStudy

  7. Vue(day3)

    一.Vue中的ajax:vue-resource和axios vue-resource是Vue实现异步加载的官方库,即Vue中的ajax.在Vue2.js之后vue-resource将不再更新维护,所 ...

  8. Oracle AWRDD报告生成和性能分析

    我写的SQL调优专栏:https://blog.csdn.net/u014427391/article/category/8679315 对于局部的,比如某个页面列表sql,我们可以使用Oracle的 ...

  9. python中的2、8、16、10进制之间的转换

    python除法的坑 众所周知,python除法有两个运算符,一个是/,还有一个是//,那么这两个有什么不同之处呢? 从图片可以得知,使用//返回一个float类型,而使用/返回一个int类型.我们总 ...

  10. springcloud之自定义简易消费服务组件

    本次和大家分享的是怎么来消费服务,上篇文章讲了使用Feign来消费,本篇来使用rest+ribbon消费服务,并且通过轮询方式来自定义了个简易消费组件,本文分享的宗旨是:自定义消费服务的思路:思路如果 ...