设计模式 - 责任链模式
责任链模式:当多个Handler都有机会处理同一个请求时,可以让这些Handler形成一条链,并沿着这条链传递该请求
核心:请求与处理解耦合,通过链依次传递处理。
案例:拦截器链,pipeline处理链
general
// 责任链模式:使请求和处理解耦,只需把请求传入链中,即可让请求被链中的所有节点依次处理。
public class Test {
public static void main(String[] args) {
MemberInfo memberInfo = new MemberInfo("kiqi007","i20132014");
Handler handler = new Handler.Builder()
.addHandler(new LoginHandler())
.addHandler(new AuthHandler())
.build();
handler.handlerRequest(memberInfo);
}
}
Abstract
// 抽象的handler类 - 责任链的核心在于链式调用(根据具体的应用场景可存在较多的变形)
public abstract class Handler {
// 指向下一个节点的
protected Handler next;
public void setNext(Handler next){
this.next = next;
};
// 主要的处理逻辑 - ①判断是否需要处理请求 ②判断是否要传递给下一个节点
public abstract void handlerRequest(MemberInfo memberInfo);
// 模板方法
protected void nextHandlerIfExist(MemberInfo memberInfo){
if(this.next != null){
this.next.handlerRequest(memberInfo);
}
}
// 链的构造器 - 建造者模式,简化链的构造过程
public static class Builder{
private Handler head;
private Handler tail;
public Builder addHandler(Handler handler){
if(this.head == null){
this.head = this.tail = handler;
} else {
this.tail.setNext(handler);
this.tail = this.tail.next;
}
return this;
}
public Handler build(){
return head;
}
}
}
Implements
public class LoginHandler extends Handler {
@Override
public void handlerRequest(MemberInfo memberInfo) {
if(memberInfo.getLogin() == 0){
login(memberInfo);
}
if(memberInfo.getLogin() == 1) {
nextHandlerIfExist(memberInfo);
}
}
private void login(MemberInfo memberInfo) {
System.out.println(memberInfo.getUsername() + " login!");
memberInfo.setLogin(1);
if(Math.random() > 0.5){
memberInfo.setAuth(1);
}
}
}
public class AuthHandler extends Handler{
@Override
public void handlerRequest(MemberInfo memberInfo) {
if(memberInfo.getAuth() == 1){
System.out.println("验证通过");
nextHandlerIfExist(memberInfo);
}else {
System.out.println("验证失败");
}
}
}
欢迎疑问、期待评论、感谢指点 -- kiqi,愿同您为友
-- 星河有灿灿,愿与之辉