设计模式——责任链(chain of responsibiltiy)

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

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

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

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

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

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

 1 package com.hone.design;
 2 //模拟request
 3 public class Request {
 4     String requestStr;
 5
 6     public String getRequestStr() {
 7         return requestStr;
 8     }
 9     public void setRequestStr(String requestStr) {
10         this.requestStr = requestStr;
11     }
12 }
 1 package com.hone.design;
 2 //模拟response类
 3 public class Response {
 4     String responseStr;
 5
 6     public String getResponseStr() {
 7         return responseStr;
 8     }
 9     public void setResponseStr(String responseStr) {
10         this.responseStr = responseStr;
11     }
12 }

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()";
    }
}
 1 package com.hone.design;
 2
 3 public class SensitiveFilter implements Filter {
 4 //定义一个filter用来过滤一些政治敏感的词汇
 6     @Override
 7     public void doFilter(Request request, Response response, FilterChain chain) {
 8         request.requestStr=request.requestStr.replace("胡锦*涛", "likeqiang")
 9                             +"----SensitiveFilter";
10         chain.doFilter(request, response, chain);
11         response.responseStr +="----SensitiveFilter";
12     }
13 }

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

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

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

 1 package com.hone.design;
 2
 3 import java.util.ArrayList;
 4 import java.util.List;
 5
 6 public class FilterChain implements Filter{
 7     List<Filter> filters=new ArrayList<Filter>();
 8     int index = 0;  //用来处理filter之间的关系用的
 9
10     public FilterChain addFilter(Filter f){
11         this.filters.add(f);
12         return this;
13     }
14
15     @Override
16     public void doFilter(Request request, Response response, FilterChain chain) {
17         if(index == filters.size()) return ;
18
19         Filter f = filters.get(index);
20         index ++;
21         f.doFilter(request, response, chain);
22     }
23 }

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

 1 package com.hone.design;
 2
 3
 4 public class MainTest {
 5     public static void main(String[] args) {
 6         String msg="hello, <你好>,<我不是影帝>就是这么简单,温家宝,就是这么简单的事情";
 7         Request request=new Request();
 8         request.setRequestStr(msg);
 9         Response response=new Response();
10         response.setResponseStr("response");
11         FilterChain fc=new FilterChain();
12         fc.addFilter(new HTMLFilter())
13           .addFilter(new SensitiveFilter());
15         fc.doFilter(request, response, fc);
16         System.out.println(request.getRequestStr());
17         System.out.println(response.getResponseStr());
18     }
20 }

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

  

时间: 2024-10-25 01:26:14

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

[设计模式] 责任链模式之变种 - 责任链子

今天看到 wikipedia 的责任链模式,好奇之下搜寻相关文章,此文章主要参考 91大的 [.NET]重构之路系列v11 –用责任链模式打破讨厌的switch case 的变种作法,所以跟原本的责任链模式的设计思路不太相同,但结果相同, 所以阅读前,建议先看完91大的文章后,在来看这篇会比较能感觉出差异. ?这边先引用91大文章结尾结论中的补充来复习一下责任链的重点, 20120415 补充:责任链的用意在于把每个角色的职责分清楚,每个对象只需要做好自己的事,透过责任链的方式来组合,并完成使用

Java 实现责任链(Chain of Responsibility)模式

类图 /** * 抽象责任 * @author stone * */ public abstract class IFilter { private IFilter successor; public IFilter getSuccessor() { return successor; } public void setSuccessor(IFilter successor) { this.successor = successor; } public abstract void handleF

设计模式--责任链

Mark:关于责任链Demo. 职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止. 类图: 请假--审批(转) 描述: 请假这个事情,相信每个人都不陌生. 我们公司是个相对很宽松的公司. 在公司里,如果你的请假时间小于0.5天,那么只需要向项目经理打声招呼就OK了. 如果超过了0.5天,但是还小于2天,那么就要去找人事部处理,当然,这就要扣工资了. 如果超过了2天,你就需要去找总经理了,工资

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

设计模式 – 责任链模式 介绍: 责任链模式是一种动态行为模式,有多个对象,每一个对象分别拥有其下家的引用.连起来形成一条链.待处理对象则传到此链上,在此链进行传递,且待处理对象并不知道此会被链上的哪个对象处理,这使得我们能够动态的添加链上的对象而且分配责任. 纯责任链和非纯责任链 责任链分为两种.纯责任链和非纯责任链. 纯责任链是待处理对象request在处理对象handler链上传递,每一个处理对象handler处理request的一部分,到终于处理完毕.非纯责任链则是待处理对象reques

设计模式----责任链模式(职责链模式)Chain of Responsibility)

一.定义 职责链模式是一种对象的行为模式.在职责链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任. 1.为请求创建一个接收此次请求对象的链 2.类型:行为型 二.适用场景 一个请求的处理需要多个对象当中的一个或几个协作处理 三.有点 请求的发送者和接收者(请求的处理)解耦 责任链可以动态的组合 四.缺

24种设计模式--责任链模式【Chain ofResponsibility Pattern】

中国古代对妇女制定了“三从四德”的道德规范,“三从”是指“未嫁从父.既嫁从夫.夫死从子”,也就是说一个女性,在没有结婚的时候要听从于父亲,结了婚后听从于丈夫,丈夫死了还要听儿子的,举个例子来说,一个女的要出去逛街,同样这样的一个请求,在她没有出嫁前她必须征得父亲的同意,出嫁之后必须获得丈夫的许可,那丈夫死了怎么办?一般都是男的比女的死的早,还要问问儿子是否允许自己出去逛街,估计你下边马上要问要是没有儿子怎么办?请示小叔子.侄子等等,在父系社会中,妇女只占从属地位,现在想想中国的妇女还是比较悲惨的

设计模式 -- 责任链模式或者叫职责链模式(Chain of Responsibility(CoR))

什么是链?前后相连,一个连接下一个,其中包括多个节点,其实责任链模式也类似,他是多个对象之间相互关联,下一个对象的操作由上一个对象关联下来,上一个对象有个方法用于指向其他对象.职责链之间的前后关系是可以改变的,主要看上一节点主要指向哪个节点. android中事件分发就是责任链模式的具体表现: View的ontouchEvent返回值设置,如果为true,交个自己的消费事件的方法去处理,如果为false,则继续向下一个进行传递. 如何实现责任链模式: 比如责任链上有,A,B,C三个对象,如果A有

24天学会设计模式------责任链模式

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka/article/details/43210027 一.责任链模式(Chain of Responsibility Pattern) 1.简介 从名字上大概也能猜出这个模式的大概模样--系统中将会存在多个有类似处理能力的对象.当一个请求触发后,请求将在这些对象组成的链条中传递,直到找到最合适的"责任"对象,并进行处理.<设计模式>中给它的定义如下:使多个对象都有机会处理请

编程内功修炼之设计模式—责任链模式

在设计模式不清楚的情况下,学习各种框架不仅难学懂,也难理解,即使理解也不够深刻. 为了走更远的路,从基础抓起,每天坚持前进一小步! 虽然即将毕业,虽然路途很远,没有梦想何必远方! package edu.designpattern.chainofresponsibility; import java.util.ArrayList; import java.util.List; import org.junit.Test; /** * 责任链设计模式 * 模型练习 * * @author heli