简介
责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
javax.servlet.Filter就是用的责任链模式
核心
1.Handler(抽象处理者): 定义一个处理请求的接口,保存对下一个结点(具体处理者)的引用
2.ConcreteHandler(具体处理者): 抽象处理者的子类,处理用户请求,可选将请求处理掉还是传给下一个结点。每个具体的处理者要构成一个链表或者顺序表。
最简单的责任链模式的UML类图
代码
抽象处理者
package com.sid.chain;
/**
* @program: DP
* @description:
* @author: Sid
* @date: 2019-01-16 17:20
* @since: 1.0
**/
public abstract class AbstractHandler {
private AbstractHandler handler;
public abstract void handleRequest(String condition);
public AbstractHandler getHandler() {
return handler;
}
public void setHandler(AbstractHandler handler) {
this.handler = handler;
}
}
具体处理者A
package com.sid.chain;
/**
* @program: DP
* @description:
* @author: Sid
* @date: 2019-01-16 17:21
* @since: 1.0
**/
public class ConcreteHandlerA extends AbstractHandler {
public void handleRequest(String condition) {
if (condition.equals("A")) {
System.out.println("ConcreteHandlerA处理");
} else {
System.out.println("ConcreteHandlerA不处理,由ConcreteHandlerA的下一个节点处理");
super.getHandler().handleRequest(condition);
}
}
}
具体处理者B
package com.sid.chain;
/**
* @program: DP
* @description:
* @author: Sid
* @date: 2019-01-16 17:23
* @since: 1.0
**/
public class ConcreteHandlerB extends AbstractHandler{
@Override
public void handleRequest(String condition) {
System.out.println("ConcreteHandlerB处理");
}
}
构建具体处理链表,并且测试
package com.sid.chain;
/**
* @program: DP
* @description:
* @author: Sid
* @date: 2019-01-16 17:24
* @since: 1.0
**/
public class ChainClient {
public static void main(String[] args) {
AbstractHandler handlerA = new ConcreteHandlerA();
AbstractHandler handlerB = new ConcreteHandlerB();
handlerA.setHandler(handlerB);
handlerA.handleRequest("B");
}
}
运行结果