设计模式-责任链模式
UML类图
使用场景
责任链模式类似于状态模式,当一个类或者某个方法需要做过多的逻辑处理的时候,我们不妨将其分开成多个子逻辑,同时使得每个逻辑块之间是解耦的。我们可以将其想象成一个链表,如果参数不满足第一个结点执行逻辑的条件,则执行该结点的后继结点,若参数仍然不满足后继结点执行逻辑的条件,则继续执行下一个后继结点。
代码实现
链结点抽象
public abstract class Handler {
protected Handler successor;
public void setSuccessor(Handler successor){
this.successor = successor;
}
public abstract void handleRequest(int request); //设置条件参数
}
链结点具体实现
public class ConcreteHandlerA extends Handler{
@Override
public void handleRequest(int request) {
if(request < 10){
System.out.println("request < 10 时候的操作");
}else{
successor.handleRequest(request);
}
}
}
public class ConcreteHandlerB extends Handler{
@Override
public void handleRequest(int request) {
if(request >= 10 && request < 20){
System.out.println("request >= 10 && request < 20 时的操作");
}else {
successor.handleRequest(request);
}
}
}
客户端实现
public class Client {
public static void main(String[] args) {
Handler h1 = new ConcreteHandlerA();
Handler h2 = new ConcreteHandlerB();
h1.setSuccessor(h2);
h1.handleRequest(9);
h1.handleRequest(11);
}
}
与状态模式的区别
最大的区别在于,状态模式需要在结点中明确指定后继是哪个结点,而责任链模式无需明确执行下一个后继结点,而是在外部指定,这就大大增加了责任链模式的灵活性。