责任链模式
这里引用维基百科对其的解释:
责任链模式在面向对象程式设计里是一种软件设计模式,它包含了一些命令对象和一系列的处理对象。每一个处理对象决定它能处理哪些命令对象,它也知道如何将它不能处理的命令对象传递给该链中的下一个处理对象。该模式还描述了往该处理链的末尾添加新的处理对象的方法。
简单的说就是该设计模式用于对某个对象或请求进行一系列的处理,这些处理逻辑组成一个链条。
传统实现
假设现在有个需求是对一段内容的内容处理,如对字符丶字母丶数字的处理
- 定义一个接口,用于定义真正的处理函数
public interface Filter {
/**
* 执行处理
* @param msg
*/
void doProcess(String msg) ;
}
- 对内容的处理我们只要实现该接口即可
public class CharacterFilter implements Filter {
@Override
public void doProcess(String msg) {
System.out.println(msg + "字符处理");
}
}
public class LetterFilter implements Filter {
@Override
public void doProcess(String msg) {
System.out.println(msg + "字母处理");
}
}
public class NumberFilter implements Filter {
@Override
public void doProcess(String msg) {
System.out.println(msg + "数字处理");
}
}
- 然后要给客户端提供一个执行入口以及添加责任链的入口
public class FilterChain {
private List<Filter> chains = new ArrayList<>() ;
/**
* 添加责任链
* @param filter
* @return
*/
public FilterChain addChain(Filter filter){
chains.add(filter) ;
return this ;
}
/**
* 执行处理
* @param msg
*/
public void process(String msg){
for (Filter chain : chains) {
chain.doProcess(msg);
}
}
}
public static void main(String[] args) {
String msg = "1内@容A==" ;
FilterChain chain = new FilterChain()
.addChain(new CharacterFilter())
.addChain(new NumberFilter())
.addChain(new LetterFilter()) ;
chain.process(msg) ;
}
总结
优点
- 降低耦合度
- 简化了对象,使得对象不需要知道链的结构
- 增强给对象指派职责的灵活性,允许动态地新增或者删除责任链
增加新的请求处理类方便
缺点
- 不能保证每个请求一定被处理。因为没有明确的接收者,所以不能保证会被处理,可能传到链的末端都得不到处理。
- 对比较长的责任链,请求的处理可能涉及多个处理对象,系统性能将受到一定影响。
- 责任链建立的合理性要靠客户端来保证,增加了客户端的复杂性,可能会由于责任链的错误设置而导致系统出错,如可能会造成循环调用。