1、基本概念
责任链模式采用链表结构,将链中每一个节点看作是一个处理不同请求的对象
且内部自动维护一-个下一个节点对象。当一个请求从链式的首端发出时,会沿着链的路径
依次传递给每一个节点对象,直至有对象处理这个请求为止。属于行为型模式。
生活中的案例:工作的审批,报备流程,闯关游戏等
2、类图和角色
类图:
主要两个角色:
抽象处理者:AbstractHandler
具体处理者:ConcreteAbstractHandlerA,ConcreteAbstractHandlerB,ConcreteAbstractHandlerC
3、案例
案例:假如一个项目得到开发报备,项目————》经过项目经理审批————》产品经理审批 ————》财务经理审批
类图:
抽象处理者:接口IProjectHandler
public interface IProjectHandler {
void doHandler(String req);
}
抽象处理者:抽象类AbstractProjectHandler
public abstract class AbstractProjectHandler implements IProjectHandler{
protected IProjectHandler nextHandler;
public void setNextHandler(IProjectHandler handler){
this.nextHandler = handler;
}
public abstract void doHandler(String req);
}
具体处理者:项目经理审批ProjectManagerHandler
public class ProjectManagerHandler extends AbstractProjectHandler {
@Override
public void doHandler(String req) {
System.out.print("项目经理同意,交由产品经理审批 ————》");
this.nextHandler.doHandler(req);
}
}
具体处理者:产品经理审批ProductManagerHandler
public class ProductManagerHandler extends AbstractProjectHandler {
@Override
public void doHandler(String req) {
System.out.print("产品经理同意,交由财务经理审批————》");
this.nextHandler.doHandler(req);
}
}
具体处理者:财务经理审批FinancialManagerHandler
public class FinancialManagerHandler extends AbstractProjectHandler {
@Override
public void doHandler(String req) {
System.out.println("财务经理审批通过");
}
}
dev类:
public class Dev {
public void submitProject(){
ProjectManagerHandler projectManagerHandler = new ProjectManagerHandler();
ProductManagerHandler productManagerHandler = new ProductManagerHandler();
FinancialManagerHandler financialManagerHandler = new FinancialManagerHandler();
projectManagerHandler.setNextHandler(productManagerHandler);
productManagerHandler.setNextHandler(financialManagerHandler);
projectManagerHandler.doHandler("开发云项目");
}
}
测试:
public class Test {
public static void main(String[] args) {
Dev dev = new Dev();
dev.submitProject();
}
}
测试输出:
项目经理同意,交由产品经理审批 ————》产品经理同意,交由财务经理审批————》财务经理审批通过
各自处理各自的任务,这样一个简单得责任链模式就完成了。在上面的dev代码中,我们可以看到在维护下一个节点的过程有些繁琐
对于这种结构我们可以想到建设者模式
修改抽象类AbstractProjectHndler 的代码,加入一个内部类Builder:
public abstract class AbstractProjectHandler implements IProjectHandler{
protected IProjectHandler nextHandler;
public void setNextHandler(IProjectHandler handler){
this.nextHandler = handler;
}
public abstract void doHandler(String req);
public static class Builder{
private AbstractProjectHandler head;
private AbstractProjectHandler tail;
public Builder addHandler(AbstractProjectHandler handler){
if(this.head == null){
this.head = this.tail = handler;
}
this.tail.setNextHandler(handler);
this.tail = handler;
return this;
}
public AbstractProjectHandler build(){
return this.head;
}
}
}
dev类修改:
public class Dev {
public void submitProject(){
ProjectManagerHandler projectManagerHandler = new ProjectManagerHandler();
ProductManagerHandler productManagerHandler = new ProductManagerHandler();
FinancialManagerHandler financialManagerHandler = new FinancialManagerHandler();
/* projectManagerHandler.setNextHandler(productManagerHandler);
productManagerHandler.setNextHandler(financialManagerHandler);
projectManagerHandler.doHandler("开发云项目");*/
AbstractProjectHandler.Builder builder = new AbstractProjectHandler.Builder();
builder.addHandler(projectManagerHandler).
addHandler(productManagerHandler).
addHandler(financialManagerHandler);
builder.build().doHandler("开发云项目");
}
}
我们可以看到这样的结构就会清晰许多。
4、优缺点
责任链模式的优点:
1、请求和处理是解耦的
2、请求节点可以处理能处理的请求,无法处理的交给下一个节点继续处理
3、易于扩展节点,符合开闭原则。