顾名思义,责任链就是将多个处理单元串成链路,是一种行为模式。
1:需要顶一个抽象类或者接口,此抽象类定义一个处理业务功能函数
2:定义一个此抽象类变量,比如通过next函数来链接下一个 需要处理业务对象,以此链接
3:定义具体处理业务对象并继承抽象类
4:按照需求从某个初始化的业务对象开始,以此递归,直到所有责任对象业务处理完毕
下面我们以登录作为例子,来具体说说责任链模式应用。
登录过程一般经历下面几个流程:用户判断----账号密码判断----验证码校验
# Handler
public abstract class Handler {
protected Handler next;
public abstract void doHandler(Member member);
public void next(Handler handler) {
this.next = handler;
}
}
# AuthHandler 密码模块验证
public class AuthHandler extend Handler {
@Override
public void doHandler(Member member) {
if (checkUsernameAndPwd(member.getUsername(),member.getPassword())) {
System.out.println("用户名密码成功");
if (next != null){
// 密码模块的 next链接 验证码模块 Handler
next.doHandler(member);
}
}else {
System.err.println("用户名或密码错误");
}
}
}
#CodeHandler : 验证码业务处理
public class CodeHandler extends Handler {
@Override
public void doHandler(Member member) {
if (checkCode(member.getCode())) {
System.out.println("验证码校验通过");
// codeHandler 已经是登录流程的最后一步,next没有链接下一个Handler,所义next为空
if(next != null){
next.doHandler(member);
}
}else {
System.err.println("验证码校验失败");
}
}
}
# UserHandler 用户名功能模块
public class UserHandler extends Handler {
@Override
public void doHandler(Member member) {
if (checkUser(member.getUsername())) {
System.out.println("用户存在,校验通过");
if (next != null) {
// 用户名功通过过,下一步是 密码AuthHandler模块,next指向 AuthHandler
next.doHandler(member);
}
} else {
System.err.println("用户不存在,请求非法");
}
}
}
上面完成了,责任链模式中各个业务功能具体实现,下面就是需要一个初始化来开启。
# Test 测试责任链模式
public class Test {
public static void main(String[] args) {
Handler authHandler = new AuthHandler();
Handler codeHandler = new CodeHandler();
Handler userHandler = new UserHandler();
// 用户 -》密码 -》验证码
// 我们按照上面的顺序来写
userHandler.next(authHandler); // userHandler的下一步指向保留AuthHandler引用
authHandler.next(codeHandler); // AuthHandler的下一步指向保留CodeHandler 引用
Member member = new Member();
member.setCode("123");
member.setUsername("cff");
member.setPassword("123");
userHandler.doHandler(member); // 通过UserHandler来开启整个流程
}
}
看来上述责任链基本写法,你可能会说这有点简单把,如果增加责任链对像,那么岂不是要添加next对象,而且也没有体现出 递和归的思想啊。
下面来看看进阶版责任链模式(配合建造者模式使用)
public abstract class Handler {
protected Handler next = null;
public abstract void doHandler(Member member);
public void next(Handler handler) {
this.next = handler;
}
public static class Builder {
private Handler header = null; // 头部Handler
private Handler tail = null; // 尾部 Handler
public Builder add(Handler handler) {
if (this.header == null) {
this.header = this.tail = handler;
} else {
tail.next = handler;
tail = handler; // 每次通过add 给责任链添加 Handler,并以此作为链条 tail
}
return this;
}
public Handler build() {
return this.header; // 返回 Head Handler 就是上面 userHandler来启动责任链
}
}
}
public class Test {
public static void main(String[] args) {
Handler authHandler = new AuthHandler();
Handler codeHandler = new CodeHandler();
Handler userHandler = new UserHandler();
// 用户 -》密码 -》验证码
// 我们按照上面的顺序来写
Member member = new Member();
member.setCode("123");
member.setUsername("cff");
member.setPassword("123");
//大家看看这里 是不是非常舒适
Handler.Builder builder = new Handler.Builder();
builder.add(userHandler).add(authHandler).add(codeHandler);
Handler handler = builder.build();
handler.doHandler(member);
}
}