Java设计模式(19)——行为模式之责任链模式(chain of responsibilitiy)
一、概述
概念
UML简图
角色
抽象处理器:定义处理请求的接口
具体处理器:接收到请求后可以选择处理,也可以选择发给下家处理(持有下家的引用)
当然这里必须指出,实际中纯的责任链模式很难寻找,一般是不纯的责任链模式:也就是一个处理器承担了部分请求,再把部分传递给下家
而纯的责任链则是要求一个处理器只能有承担责任和传递给下家的两种情况。一般的,我们见到的是不纯的居多。
二、实践
给出相应角色的代码
抽象处理器
/**
* 抽象处理器接口
*
* @author Administrator
**/
public abstract class Handler {
/**
* 处理器下家,此处采用逻辑为如果有下家则给下家处理,没有下家则自己处理
*/
protected Handler successor;
public Handler getSuccessor() {
return successor;
}
public void setSuccessor(Handler successor) {
this.successor = successor;
}
public abstract void handleRequest();
}
具体处理器
/**
* 具体处理器
*
* @author Administrator
**/
public class ConcreteHandler extends Handler{
@Override
public void handleRequest() {
if (getSuccessor() != null) {
System.out.println("处理转接给:" + getSuccessor());
getSuccessor().handleRequest();
} else {
System.out.println("没有下家处理请求,此处处理请求");
}
}
}
客户端(把请求给第一个处理器)
/**
* 客户端
* @author Administrator
**/
public class Client {
public static void main(String[] args) {
Handler handler1 = new ConcreteHandler();
Handler handler2 = new ConcreteHandler();
// 指出第一个处理器的对象的下家是第二个处理器
handler1.setSuccessor(handler2);
handler1.handleRequest();
}
}
有了上面的基础,我们来看马士兵老师的栗子:
想要定义三个规则应对一个字符串的过滤,分别过滤不同的规则(如HTML过滤,关键字过滤),此实例本质与上面是相通的,请注意看本质!