责任链模式面向对象程式设计里是一种软件设计模式,它包含了一些命令对象和一系列的处理对象。

每一个处理对象决定它能处理哪些命令对象,它也知道如何将它不能处理的命令对象传递给该链中的下一个处理对象。也就是说责任链决定了任务的处理上方和下方。

该模式还描述了往该处理链的末尾添加新的处理对象的方法。<wiki>

1:建立一个filte接口,用来处理客户度发送给服务器端,以及服务器端返回给客户端的消息。

 public interface Filter {
void doFilter(Request request, Response response, FilterChain chain);
}

2:可以模拟客户端,以及服务器端处理消息的类。

 package com.hone.design;
//模拟request
public class Request {
String requestStr; public String getRequestStr() {
return requestStr;
}
public void setRequestStr(String requestStr) {
this.requestStr = requestStr;
}
}
 package com.hone.design;
//模拟response类
public class Response {
String responseStr; public String getResponseStr() {
return responseStr;
}
public void setResponseStr(String responseStr) {
this.responseStr = responseStr;
}
}

3:我们假设这样一个项目,准备做一个小型的论坛性质的,那么可以用filter对消息进行处理,防止一些敏感的词汇,和一些不恰当的字符。

那么我们肯定要定义filter。

package com.hone.design;
//定义一个filter,用来过滤一些包含了html标签的消息。
public class HTMLFilter implements Filter{
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
//process the html tag <>
request.requestStr = request.requestStr.replace('<', '[')
.replace('>', ']') + "---HTMLFilter()";
chain.doFilter(request, response, chain);
response.responseStr += "---HTMLFilter()";
}
}
 package com.hone.design;

 public class SensitiveFilter implements Filter {
//定义一个filter用来过滤一些政治敏感的词汇
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
request.requestStr=request.requestStr.replace("胡锦*涛", "likeqiang")
+"----SensitiveFilter";
chain.doFilter(request, response, chain);
response.responseStr +="----SensitiveFilter";
}
}

4:我们的想法是这样的,用户现在客户端发送一个消息,在client——sever的过程中,先经过HTMLfilter过滤器,在经过SensitiveFilter过滤器到达服务器端。

等待sever处理之后在经过SensitiveFilter——HTMLfilter反馈给client。整过过程的难点是:怎么处理好过滤器之间的处理关系,让filter经过类似于的方式来处理消息。

可以考虑用一个FilterChain,用过链的方式来处理filter之间的关系

 package com.hone.design;

 import java.util.ArrayList;
import java.util.List; public class FilterChain implements Filter{
List<Filter> filters=new ArrayList<Filter>();
int index = 0;  //用来处理filter之间的关系用的 public FilterChain addFilter(Filter f){
this.filters.add(f);
return this;
} @Override
public void doFilter(Request request, Response response, FilterChain chain) {
if(index == filters.size()) return ; Filter f = filters.get(index);
index ++;
f.doFilter(request, response, chain);
}
}

5:用main方法来处理消息。

 package com.hone.design;

 public class MainTest {
public static void main(String[] args) {
String msg="hello, <你好>,<我不是影帝>就是这么简单,温家宝,就是这么简单的事情";
Request request=new Request();
request.setRequestStr(msg);
Response response=new Response();
response.setResponseStr("response");
FilterChain fc=new FilterChain();
fc.addFilter(new HTMLFilter())
   .addFilter(new SensitiveFilter());
fc.doFilter(request, response, fc);
System.out.println(request.getRequestStr());
System.out.println(response.getResponseStr());
}
}

整个消息的处理过程都强调filter 的先后处理顺序。

  

设计模式——责任链(chain of responsibiltiy)的更多相关文章

  1. iOS设计模式 - 责任链

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

  2. java 设计模式 -- 责任链模式

    设计模式 – 责任链模式 介绍: 责任链模式是一种动态行为模式,有多个对象,每一个对象分别拥有其下家的引用.连起来形成一条链.待处理对象则传到此链上,在此链进行传递,且待处理对象并不知道此会被链上的哪 ...

  3. 浅谈Python设计模式 -- 责任链模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 之前在最开始就聊了Python设计模式有三种,其中关于创建型和结构型设计模式基本 ...

  4. 【设计模式】Java设计模式 - 责任链模式

    [设计模式]Java设计模式 - 责任链模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 目录 [设计模式]Java设计模式 - 责 ...

  5. [工作中的设计模式]责任链模式chain

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

  6. 设计模式-责任链模式Chain of Responsibility)

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

  7. C#设计模式-责任链模式(Chain of Responsibility Pattern)

    引子 一个事件需要经过多个对象处理是一个挺常见的场景,譬如采购审批流程,请假流程,软件开发中的异常处理流程,web请求处理流程等各种各样的流程,可以考虑使用责任链模式来实现.现在以请假流程为例,一般公 ...

  8. 23种设计模式--责任链模式-Chain of Responsibility Pattern

    一.责任链模式的介绍 责任链模式用简单点的话来说,将责任一步一步传下去,这就是责任,想到这个我们可以相当击鼓传花,这个是为了方便记忆,另外就是我们在项目中经常用到的审批流程等这一类的场景时我们就可以考 ...

  9. Java设计模式-责任链模式(Chain of Responsibility)

    接下来我们将要谈谈责任链模式,有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,直到某一对象决定处理该请求.但是发出者并不清楚到底最终那个对象会处理该请求,所以,责任 ...

随机推荐

  1. 四:SpringThinking

    一:将对象配置到容器 1.xml文件:空参构造 <bean name="user" class="com.spring.bean.User" scope= ...

  2. encodeURI和 encodeURIComponent 的作用及应用

    首先解释下 encodeURIComponent 的作用:将文本字符串编码为一个有效的统一资源标识符 (URI).为什么要用这个是因为我想把 username 整个当做参数传递给 CGI, 而不让 C ...

  3. C Primer Plus note7

    这个程序是<C Primer Plus 中文版 第六版>书上198页的代码,是一个值的琢磨的程式. 有时间可以看一看: 尤其是下面这几句代码,很精妙: 用了很短的程式,得出了最大值和最小值 ...

  4. IE6 行内定义成块元素后高度失效

    问题描述: ie6下,空标签块元素height定义失效,表现为除设置的height值外还会显示N像素额外的高度. 实际运用中,若标签为空且定义了小于14px的高度,再加入一背景图的话,会发现该元素高度 ...

  5. 如何删除EF4.0以上的版本

    通过VS2010的Package Manager Console安装的EF版本,会在项目根目录的packages目录中生成一个EntityFramework.4.3.0目录,安装什么版本就是什么版本的 ...

  6. Java基础之Map的遍历

    遍历Map集合,有四种方法:   public static void main(String[] args) { Map<String, String> map = new HashMa ...

  7. python 二叉树计算器

    例子:计算1+2+3+4的值 代码: class Buffer(object): """字符串处理函数""" def __init__(se ...

  8. C#调用Excel VBA宏[转载]

    原文地址:https://www.cnblogs.com/heekui/archive/2008/03/30/1129355.html 近日的一系列工作是做网站的营运维护,因此做了大量的支持工具.有E ...

  9. Windows10 IIS配置PHP运行环境(原创)

    在Windows 10/8 的IIS(8.0)中搭建PHP运行环境: 如果解决了您的问题,文章底部点击下关注,做原创内容不容易,谢谢.转载请注明出处 PS:顺便推荐下自己写的,开源PHP极速后台开发框 ...

  10. sql 嵌套查询

    sql 某一字段 数量大于1 SELECT * FROM ecm_goods_spec AWHERE ( SELECT count( * ) FROM ecm_goods_spec BWHERE A. ...