简介
责任链定义
责任链模式(Chain of Responsibility): 使多个对象都有机会处理同一请求,从而避免请求的发送者和接受者之间的耦合关系,每个对象都是一个处理节点,将这些对象连成一条链,并沿着这条链传递该请求。
责任链经常使用在一些一个请求可能需要多个对象处理的情况,可能客户端也不清楚这个请求具体应该交给哪个对象来处理,但是放在这个责任链中,对象是清楚自己要处理那些责任的,如果处理不了的则会继续沿着责任链传递请求。
案例
我们WEB开发中经常会遇到的一种情况就是对不同权限的用户开放不同接口,显示不同的界面。假设我们的权限分为三种,未登录,已登录,管理员。我们每次用户进入页面都需要判断一下用户的状态来决定开放的接口。以此为例
责任链抽象类
public abstract class Handler {
public static int UNREGISTERED= 1;
public static int LOGGEDIN = 2;
public static int ADMIN = 3;
//用户等级
protected int Level;
//必须包含一个自己对象,用来传递责任
protected Handler chain;
public void next(Handler handler){
chain=handler;
}
public abstract void HandlerRequest(int Level);
}
未登录用户责任链节点
public class Unregistered extends Handler{
public Unregistered(int Level) {
this.Level=Level;
}
@Override
public void HandlerRequest(int Level) {
if(this.Level<=Level){
System.out.println("未登录相关功能开放");
chain.HandlerRequest(Level);
}else
{
System.out.println("权限不足请先登录");
}
}
}
已登录用户责任链节点
public class LoggedIn extends Handler{
public LoggedIn(int Level) {
this.Level=Level;
}
@Override
public void HandlerRequest(int Level) {
if(this.Level<=Level){
System.out.println("已登录,登录用户相关接口已经开放");
chain.HandlerRequest(Level);
}else
{
System.out.println("权限不足请先登录");
}
}
}
管理员责任链节点
public class Admin extends Handler{
public Admin(int Level) {
this.Level=Level;
}
@Override
public void HandlerRequest(int Level) {
if(this.Level<=Level){
System.out.println("具有管理员权限,管理员相关接口已经开放");
}else {
System.out.println("权限不足请求助管理员");
}
}
}
测试
@Test
public void Test()
{
Handler unregistered = new Unregistered(Handler.UNREGISTERED);
Handler loggedIn = new LoggedIn(Handler.LOGGEDIN);
Handler admin = new Admin(Handler.ADMIN);
unregistered.next(loggedIn);
loggedIn.next(admin);
System.out.println("登录用户");
unregistered.HandlerRequest(2);
System.out.println("\n管理员用户");
unregistered.HandlerRequest(3);
System.out.println("\n未登录用户");
unregistered.HandlerRequest(1);
}
测试结果
登录用户
未登录相关功能开放
已登录,登录用户相关接口已经开放
权限不足请求助管理员
管理员用户
未登录相关功能开放
已登录,登录用户相关接口已经开放
具有管理员权限,管理员相关接口已经开放
未登录用户
未登录相关功能开放
权限不足请先登录
总结
其实责任链分为两种,分别为纯的责任链和不纯的责任链。纯的责任链要求一个节点只有两种选择,承担责任或者传递责任,不允许承担一部分责任。不纯的责任链则是一个节点可以承担一部分的责任并将另一部分继续传递。本文的例子是一个不纯的责任链。
通过本文的例子可以看出来,责任链模式实现了将请求的发送者和请求的处理者解耦,同时每个责任链节点之间的处理也可以相对隔离,每个节点只需要承担自己需要承担的责任,而不用考虑其他责任。