模式动机:
职责链可以是一条直线、一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求。
链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并使请求沿着链传递,由链上的处理者对请求进行相应的处理,
客户端无须关心请求的处理细节以及请求的传递,只需将请求发送到链上即可,将请求的发送者和请求的处理者解耦。这就是职责链模式的模式动机。
模式定义
职责链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,
并且沿着这条链传递请求,直到有对象处理它为止。由于英文翻译的不同,职责链模式又称为责任链模式,它是一种对象行为型模式。
一条直线型的责任链模式实例
(1)过滤器接口
package com.alan.chainOfResponsibility;
public interface MsgFilter {
String doFiler(String msg) ;
}
(2)过滤Html标签
package com.alan.chainOfResponsibility;
public class HtmlFilter implements MsgFilter {
@Override
public String doFiler(String msg) {
return msg.replaceAll("<","{").replaceAll(">", "}") ;
}
}
(3)过滤不文明的单词
package com.alan.chainOfResponsibility;
public class SensitiveFilter implements MsgFilter{
//过滤敏感信息
@Override
public String doFiler(String msg) {
//将骂人的话,修改为和谐的话
return msg.replaceAll("尼玛的", "亲爱的");
}
}
(4)过滤器链
import java.util.ArrayList;
import java.util.List;
/**
*
* @author Wu,Lele
* @Created at 2013-8-20 下午09:44:59
* @ClaaName FilterChain
* 将几个Filter作为一个Filer来处理的过滤器链
*/
public class FilterChain implements MsgFilter{
List<MsgFilter> filters = new ArrayList<MsgFilter>() ;
//返回this,可以链式编程,类似于StringBuilder 的append方法
public FilterChain addFilter(MsgFilter msgFilter){
this.filters.add(msgFilter) ;
return this ;
}
@Override
public String doFiler(String msg) {
// TODO Auto-generated method stub
for(MsgFilter f:filters){
msg = f.doFiler(msg) ;
}
return msg ;
}
}
(5)消息的处理器
package com.alan.chainOfResponsibility;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author Wu,Lele
* @Created at 2013-8-20 下午09:44:00
* @ClaaName MsgHandler
* @Descripetion MsgHandler是处理消息的类,对消息进行过滤
*/
public class MsgHandler {
private List<MsgFilter> msgHandlerFilters = new ArrayList<MsgFilter>() ;
public String messageHandler(String msg){
for(MsgFilter f:msgHandlerFilters){
msg = f.doFiler(msg) ;
}
return msg ;
}
//添加过滤条件
public MsgHandler addFilter(MsgFilter filter){
this.msgHandlerFilters.add(filter) ;
return this ;
}
public List<MsgFilter> getMsgHandlerFilters() {
return msgHandlerFilters;
}
public void setMsgHandlerFilters(List<MsgFilter> msgHandlerFilters) {
this.msgHandlerFilters = msgHandlerFilters;
}
}
(6)测试类
package com.alan.chainOfResponsibility;
public class Client {
public static void main(String[] args) {
//要处理的消息
String msg = "尼玛的,张三,<html><head></head></html>" ; //尼玛的 敏感信息 后面的特殊字符
//创建一个消息的处理类
MsgHandler msgHandler = new MsgHandler() ;
//创建消息的过滤器链
//(1)创建一个敏感信息的过滤器
SensitiveFilter sensitiveFilter = new SensitiveFilter() ;
//(2)创建一个过滤器链
FilterChain filterChain = new FilterChain() ;
filterChain.addFilter(new HtmlFilter()) ;
//将过滤条件加到消息的处理类里面
msgHandler.addFilter(sensitiveFilter).addFilter(filterChain) ;//链式编程
// msgHandler.addFilter(filterChain) ;
System.out.println(msgHandler.messageHandler(msg)) ;
}
}
结果:
亲爱的,张三,{html}{head}{/head}{/html}