java设计模式--责任链(一)

责任链也可以叫做过滤器或者拦截器,只是不同的叫法而已,都是对当前的数据在使用前做相应的处理。

阶段一:

从简单的例子入手。问题描述:有一个字符串,需要对这个字符串做一些处理,然后输出。这里我定义了一个处理器MsgDealer,用来对字符串进行相应的处理,相应的代码如下:

Main:作为数据的入口

package chanOfResponsibility;

public class Main {
	public static void main(String[] args) {
		String msg = "java知识点好多,需要花好多时间精力去学。好像出去旅游。";
		MsgDealer msgDealer = new MsgDealer();
		msg = msgDealer.dealMsg(msg);
		System.out.println(msg);
	}
}

MsgDealer:字符串的处理类

package chanOfResponsibility;

public class MsgDealer {
	public String dealMsg(String msg){
		msg = msg.replaceAll("。", ";");
		return msg;
	}
}


上面这段代码很简单,我只是用MsgDealer来将字符串中的“。”改成了“;”。

现在如果我想要对这个字符串做进一步的处理,那么我就要修改MsgDealer的dealMsg方法,在里面再新加处理的代码就行了。比如我还想将所有的“多”替换成“*”,那么MsgDealer就变成如下:

package chanOfResponsibility;

public class MsgDealer {
	public String dealMsg(String msg){
		msg = msg.replaceAll("。", ";");
		
		msg = msg.replaceAll("多", "*");
		return msg;
	}
}

如果这样的处理方式很复杂,而不是这么简单的一行代码,那么我们应该想办法将这段处理代码封装起来。新建一个接口如下:

package chanOfResponsibility;

public interface Filter {
	public String doFilter(String msg);
}

实现类如下:

package chanOfResponsibility;

public class SymbolFilter implements Filter{

	@Override
	public String doFilter(String msg) {
		msg = msg.replaceAll("。", ";");
		return msg;
	}
	
}

package chanOfResponsibility;

public class CharacterFilter implements Filter{

	@Override
	public String doFilter(String msg) {
		msg = msg.replaceAll("多", "*");
		return msg;
	}

}

此时MsgDealer变成了:

package chanOfResponsibility;

public class MsgDealer {
	public String dealMsg(String msg){
		SymbolFilter symbolFilter = new SymbolFilter();
		msg = symbolFilter.doFilter(msg);
		
		CharacterFilter characterFilter = new CharacterFilter();
		msg = characterFilter.doFilter(msg);
		return msg;
	}
}


此时MsgDealer的代码有些冗余,SymbolFilter与CharacterFilter都实现了Filter借口,它们两个组合起来就相当于一个过滤器链。先写一个简单的链,用数组将这两个过滤器放在一起,代码如下:

package chanOfResponsibility;

public class MsgDealer {
	
	public Filter[] f = new Filter[]{new SymbolFilter(),new CharacterFilter()};
	
	public String dealMsg(String msg){
		for(Filter filter : f){
			msg = filter.doFilter(msg);
		}
		return msg;
	}
}

这样如果再新增一个filter,直接在f中再新增一个就行了,同时你还可以控制过滤器的先后次序。这其实就是个简单的责任链。


未完待续。。。


以上是个人观点,如有错误,欢迎指正。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值