Java设计模式---ChainOfResponsibility责任链模式
参考于 :
大话设计模式
马士兵设计模式视频
代码参考于马士兵设计模式视频
写在开头:职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系
图来自大话设计模式,下面我的代码中,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责任链模式的更多相关文章
- 详解java设计模式之责任链模式
		
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt175 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次 ...
 - Java设计模式之责任链模式、职责链模式
		
本文继续介绍23种设计模式系列之职责链模式. 什么是链 1.链是一系列节点的集合. 2..链的各节点可灵活拆分再重组. 职责链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间 ...
 - JAVA设计模式之责任链模式
		
在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
 - Java设计模式之八 ----- 责任链模式和命令模式
		
前言 在上一篇中我们学习了结构型模式的享元模式和代理模式.本篇则来学习下行为型模式的两个模式, 责任链模式(Chain of Responsibility Pattern)和命令模式(Command ...
 - Java设计模式应用——责任链模式
		
生产一个产品,需要依次执行多个步骤,才能完成,那么是使用责任链模式则是极好的. 在性能告警模块开发过程中,创建一条告警规则需要执行阈值解析,中间表生成,流任务生成,规则入库,告警事件入库等诸多操作.如 ...
 - java设计模式之责任链模式(Chain of Responsibility)
		
转自:http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html 在阎宏博士的<JAVA与模式>一书中开头是这样 ...
 - java设计模式之责任链模式以及在java中作用
		
责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个 ...
 - 击鼓传花联想到了Java设计模式:责任链模式
		
目录 应用场景 简单示例 责任链模式 定义 意图 主要解决问题 何时使用 优缺点 击鼓传花的故事 应用场景 http web请求处理,请求过来后将经过转码.解析.参数封装.鉴权等一系列的处理(责任), ...
 - 【java设计模式】责任链模式
		
可以随时添加过滤器,并在主方法中添加删除: Main package com.tn.filter; public class Main { public static void main(String ...
 
随机推荐
- Spring里的Async注解实现异步操作
			
异步执行一般用来发送一些消息数据,数据一致性不要求太高的场景,对于spring来说,它把这个异步进行了封装,使用一个注解就可以实现. 用法 程序启动时开启@EnableAsync注解 建立新的类型,建 ...
 - Kubernetes 在生产环境中常用架构
			
Kubernetes 在生产环境中常用架构 首先,我们来梳理下Kubernetes生产架构,其设计适用于绝大多数环境.如下图所示 在该架构中,我们可以将其分为四层,如下: Client层:即Kuber ...
 - Springcloud Gateway 路由管理
			
Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开 ...
 - Asp.NETCore轻松学系列阅读指引目录
			
前言 耗时两个多月,坚持写这个入门系列文章,就是想给后来者更好更快的上手体验,这个系列可以说是从入门到进阶,适合没有 .NETCore 编程经验到小白同学,也适合从 .NET Framework 迁移 ...
 - 解决Google Play审核中的WebViewClient.onReceivedSslError问题
			
Google Play应用市场提交应用审核,出现因WebViewClient.onReceivedSslError问题导致拒绝通过. Google Paly给出的详情地址:support.google ...
 - C#程序代码中常用的快捷键
			
C#中的快捷键,可以更方便的编写代码 //CTRL + SHIFT + B 生成解决方案 //CTRL + F7 生成编译 //CTRL + O 打开文件 //CTRL + SHIFT + O 打开项 ...
 - C# 添加Excel表单控件(Form Controls)
			
在Excel中,添加的控件可以和单元格关联,我们可以操作控件来修改单元格的内容,在下面的文章中,将介绍在Excel中添加几种不同的表单控件的方法,包括: 添加文本框(Textbox) 单选按钮(Rad ...
 - QT读取xml配置文件
			
//获取字符串字段 QString ConfigHelper::GetStringConfigValue(QString str) { if(str == "InitDeviceNo&quo ...
 - 【学习笔记】【Design idea】二、产品内测、公测、候选版本的概念及版本代码的书写
			
一.前言 参考:百度百科 https://baike.baidu.com/item/beta/640969?fr=aladdin 广义上对测试有着三个传统的称呼:Alpha(α).Beta(β)和Ga ...
 - c语言总练习题
			
!4,42 ?45 1 Description 键盘输入一个双精度数据,乘以2以后输出 Input 输入一个double型数据 Output 输出它的两倍数,结果保留8位小数 Sample Input ...