参考于 :

  大话设计模式

  马士兵设计模式视频

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

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

  图来自大话设计模式,下面我的代码中,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. python接口自动化(二十六)--批量执行用例 discover(详解)

    简介 我们在写用例的时候,单个脚本的用例好执行,那么多个脚本的时候,如何批量执行呢?这时候就需要用到 unittest 里面的 discover 方法来加载用例了.加载用例后,用 unittest 里 ...

  2. Mybaits-plus实战(三)

    1. Mybaits-plus实战(三) 1.1. 特殊使用规则 1.1.1. Model逻辑删除 数据库对应实体类,继承Model类可以实现AR模式的sql语句操作,但这里需要注意的是,对逻辑删除, ...

  3. nodeJs的nodemailer发邮件报错hostname/IP doesn't match certificate's altnames怎么解决?

    今天在开发过程中碰到一个问题,即使用node发送邮件时报错hostname/IP doesn't match certificate's altnames,在网上查了解决办法有两个, 加rejectU ...

  4. MongoDB【快速入门】

    1.MongDB 简介 MongoDB(来自于英文单词"Humongous",中文含义为"庞大")是可以应用于各种规模的企业.各个行业以及各类应用程序的开源数据 ...

  5. 设计模式 | 工厂方法模式(factory method)

    定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 结构:(书中图,侵删) 一个工厂的抽象接口 若干个具体的工厂类 一个需要创建对象的抽象接口 若干个 ...

  6. h5实现实时时钟

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"/> <meta nam ...

  7. 解决ruby安装后无法添加淘宝gem源------------学习记录

    使用sass ,需要安装ruby,会建议移除gem源,添加淘宝的gem源,但是淘宝的镜像源已经停止维护啦!!用https://gems.ruby-china.com 代替即可. 操作如下: 1)删除原 ...

  8. 历经15个小时,终于评出这8本最受欢迎的SQL书籍

    文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 来源 | 程序员书库(ID:OpenSourceTop) 原文链接 | https://www.lif ...

  9. 如何在eclipse中快速debug到想要的参数条件场景下

    前言 俗话说,工欲善其事必先利其器. 对于我们经常使用的开发工具多一些了解,这也是对我们自己工作效率的一种提升. 场景 作为开发,我们经常会遇到各种bug,大部分的bug很明确,我们直接可以打断点定位 ...

  10. CYQ.Data 对于分布式缓存Redis、MemCache高可用的改进及性能测试

    背景: 随着.NET Core 在 Linux 下的热动,相信动不动就要分布式或集群的应用的需求,会慢慢火起来. 所以这段时间一直在研究和思考分布式集群的问题,同时也在思考把几个框架的思维相对提升到这 ...