设计模式之责任链

  刚刚认真开始学java不超过半年时间,现在在学习struts2框架,接触到了责任链这个设计模式,并通过这个模式似乎明白了aop切面编程,因为如果没有责任链存在的话,则程序不会从中被断很多次,但是有了这个链子,就像把一个很流畅的程序切了很多次一样,我很喜欢这个名字,话不多说了,介绍责任链:(下面这个例子是看马士兵老师的视频里面讲到的)

  比如要写一个论坛,论坛上肯定是要发帖子的,我们想对刚发的帖子进行检查,看是不是有脚本程序,或者对一些敏感的词进行过滤,可以设计如下:

定义一个接口Filter:让每实现一个过滤功能的类都实现这个接口,则假设现在有两个实现类,HTMLFilter和SensitiveFilter,它们的代码如下

接口:

package ChainOfResponsibility;

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

HTMLFilter类:

package ChainOfResponsibility;

public class HTMLFilter implements Filter {

@Override
public void doFilter(Request request,Response
response,FilterChain fc)
{
request.setRequestStr(request.getRequestStr().replace("<",
"[").replace(">", "]")+"------HTMLFilter");
fc.doFilter(request,
response,
fc);
response.setResponseStr(response.getResponseStr()+"-----HTMLFilter");
// return
request.getRequestStr();
}

}

SensitiveFilter类:

package ChainOfResponsibility;

public class SensitiveFilter implements Filter {

@Override
public void doFilter(Request request,Response
response,FilterChain fc)
{
request.setRequestStr(request.getRequestStr().replace("爆力",
"")+"-----SensitiveFilter") ;
fc.doFilter(request, response,
fc);
response.setResponseStr(response.getResponseStr()+"-----SensitiveFilter");
// return
request.getRequestStr();
}

}

再定义一个Filter的大管家,这个大管家里有一个ArrayList(),里面放的是Filter,则可以运用多态,很方便的对实现Filter的类进行管理,这个大管家当然也可以实现Filter接口,这样就可以加很多个实现了Filter接口的类的对象到大管家里,这个大管家里有除了有set和get方法外,还有两个方法,代码如下:

大管家FilterChain类:

package ChainOfResponsibility;

import java.util.ArrayList;
import java.util.List;

public class FilterChain implements Filter{
private List<Filter>
filters = new ArrayList<Filter>();
int index = 0;

public
List<Filter> getFilters() {
return filters;
}

public void setFilters(List<Filter> filters) {
this.filters =
filters;
}

public FilterChain addFilter(Filter f){
filters.add(f);
return
this;
}

public void doFilter(Request request,Response
response,FilterChain fc){
if(index >=
fc.getFilters().size())
return;
Filter f =
fc.getFilters().get(index);
index++;
f.doFilter(request, response,
fc);

// return request.getRequestStr();
}

}

add方法是将想要新的过滤功能时,采用的方法,doFilter方法是这个类的重要方法,它的作用是控制ArrayList里的Filter的执行顺序和一个非常非常重要的作用,就是当一个东西传进来时,我想先对它进行所有的过滤,然后服务器再返回给我一个Response,这个Response是之前过滤时执行的反顺序,这时就要先定义一个Request类和一个Response类,然后在测试类里将大管家FilterChain,Request,Response三个类同时传入到大管家的doFilter方法是执行,具体执行则是先执行arrayList中的第0个元素的Filter,再返回来执行大管家的doFilter方法,然后再执行第1个元素的doFilter方法,再返回来执行大管家的doFilter方法,直到把所有的arrayList里的元素会部执行完,返回response时,过滤它就会按照与request过滤时反序执行了,如果还不明白,就看代码吧!

Request类:

package ChainOfResponsibility;

public class Request {
private String requestStr;

public String getRequestStr() {
return requestStr;
}

public void setRequestStr(String requestStr) {
this.requestStr =
requestStr;
}

}

Response类:

package ChainOfResponsibility;

public class Response {
private String responseStr="response";

public String getResponseStr() {
return responseStr;
}

public void setResponseStr(String responseStr) {
this.responseStr =
responseStr;
}

}

测试类:

package ChainOfResponsibility;

public class Test {

/**
* @param args
*/
public static void main(String[] args)
{
String msg = "hello world <script> 爆力 哈哈哈哈哈哈。。。。。";
Request
request = new Request();
Response response = new
Response();
request.setRequestStr(msg);
FilterChain fc = new
FilterChain();

fc = fc.addFilter(new HTMLFilter())

.addFilter(new
SensitiveFilter());

fc.doFilter(request,response,fc);
System.out.println(request.getRequestStr());
System.out.println(response.getResponseStr());
}

}

好不容易弄明白的,一定要把它记下来,以防忘了的时候可以再回来查看!

还是第一次自己写博客,感觉不错,下次应该还会再写,嘿嘿

 

时间: 2024-12-12 17:03:06

设计模式之责任链的相关文章

设计模式之责任链模式20170717

行为型设计模式之责任链模式: 一.含义 责任链模式的核心在"链"上,"链"是由多个处理者(对象)组成的,由这条链传递请求,直到有对象处理它为止(在链中决定谁来处理这个请求),并返回相应的结果 二.代码说明 1.主要有两个角色 1)处理者 它能够对请求做出处理(请求得到处理则直接返回,否则传到下一个处理者),设置下一个处理者(这两个操作可以抽象出来), 同时每个处理者都有一个相应的处理级别,以及具体的处理操作(父类实现请求传递,子类实现请求处理) 2)被处理者(请求者

设计模式之责任链模式--- Pattern chain-of-responsibility

模式的定义 责任链模式定义如下: Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it. 使多个对象都有机会处理请求,从而避免请求的发送

设计模式_责任链模式

定义 Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it.(使多个对象都有机会处理请求.从而避免了请求的发送者和接受者之间的耦合关系.

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

本文继续介绍23种设计模式系列之职责链模式. 什么是链 1.链是一系列节点的集合. 2..链的各节点可灵活拆分再重组. 职责链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系, 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止. 角色 抽象处理者角色(Handler):定义出一个处理请求的接口.如果需要,接口可以定义 出一个方法以设定和返回对下家的引用.这个角色通常由一个Java抽象类或者Java接口实现. 具体处理者角色(ConcreteHan

C#设计模式:责任链模式

设计模式是面向对象编程的基础,是用于指导程序设计.在实际项目开发过程中,并不是一味将设计模式进行套用,也不是功能设计时大量引入设计模式.应该根据具体需求和要求应用适合的设计模式.设计模式是一个老话题了,因为最近在设计“网关API”组件(后续介绍),采用“责任链设计模式”进行设计,所以先进行回顾记录.  一.责任链模式介绍 责任链模式是指一个处理需要涉及多个过程或者角色参与处理,并基于某个约定组成一个链,每个过程或者角色拥有各自职责进行处理.责任链模式有效组织一个过程处理,同时子过程之间职责明确.

Java设计模式之责任链设计模式

职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将所有处理对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. ? 请求传递方向:从低级到高级 ? 重点:如何形成这个责任链 ? 特点:发出处理请求的客户端并不知道是系统当中的哪一个对象最终处理这个请求,这样系统的更改可以在不影响客户端的情况下动态地重新组织和分配责任.1. 派生类中都具备的功能(1) 都要设置后继者(一样)(2) 都能实现自己职责范围

【GOF23设计模式】责任链模式

来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_责任链模式.公文审批.供应链系统的采购审批.异常链.过滤器和拦截器调用过程 1 package com.test.chainOfResp; 2 /** 3 * 封装请假的基本信息 4 */ 5 public class LeaveRequest { 6 private String empName; 7 private int leaveDays; 8 private String reason; 9 10 publi

【JS设计模式】责任链设计模式的代码示例

责任链设计模式: 在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任. 责任链模式涉及到的角色如下所示:● 抽象处理者(Handler)角色:定义出一个处理请求的接口.如果需要,接口可以定义 出一个方法以设定和返回对下家的引用.这个角色通常由一个Java抽象类或者Java接口实现.上图中Handle

Head First设计模式之责任链模式

一.定义 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止. 主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了. 何时使用:在处理消息的时候以过滤很多道. 如何解决:拦截的类都实现统一接口. 二.结构 从责任链模式的定义可以发现,责任链模式涉及的对象只有处理者角色,但由于有多个处理者,它们具有共同的处理请求的