设计模式-责任链模式(代码)

模式动机:

职责链可以是一条直线、一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求。

 
  链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并使请求沿着链传递,由链上的处理者对请求进行相应的处理,
 
客户端无须关心请求的处理细节以及请求的传递,只需将请求发送到链上即可,将请求的发送者和请求的处理者解耦。这就是职责链模式的模式动机。

 

模式定义

      职责链模式(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}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值