责任链模式学习
校验:
public abstract class Handler<T> {
protected Handler next;
private void next(Handler next) {
this.next = next;
}
public abstract void doHandler(Member member);
public static class Builder<T> {
private Handler<T> head;
private Handler<T> tail;
public Builder<T> addHandler(Handler handler) {
if (this.head == null) {
this.head = this.tail = handler;
return this;
}
this.tail.next(handler);
this.tail = handler;
return this;
}
public Handler<T> build() {
return this.head;
}
}
}
参数校验:
public class ValidateHandler extends Handler {
@Override
public void doHandler(Member member) {
if (StringUtils.isEmpty(member.getUsername()) ||
StringUtils.isEmpty(member.getPassword())) {
System.out.println("用户名和密码不能为空");
return;
}
if (null != next) {
next.doHandler(member);
}
}
}
登录校验:
public class LoginHandler extends Handler {
@Override
public void doHandler(Member member) {
if (!"cyf".equals(member.getUsername()) || !"1234".equals(member.getPassword())) {
System.out.println("用户名密码不正确");
return;
}
if (null != next) {
next.doHandler(member);
}
}
}
权限校验:
public class AuthHandler extends Handler {
@Override
public void doHandler(Member member) {
if (!"001".equals(member.getRoleName())) {
System.out.println("您不是管理员,没有操作权限");
return;
}
if (null != next) {
next.doHandler(member);
}
}
}
业务校验:
public class BusinessLogicHandler extends Handler {
@Override
public void doHandler(Member member) {
System.out.println("执行业务逻辑。。");
}
}
执行:
Handler.Builder builder = new Handler.Builder();
builder.addHandler(new ValidateHandler())//1、参数校验
.addHandler(new LoginHandler())//2、登录校验
.addHandler(new AuthHandler())//3、权限校验
.addHandler(new BusinessLogicHandler());//4、业务校验
Member member = new Member();
member.setUsername("cyf");
member.setPassword("1234");
member.setRoleName("管理员");
builder.build().doHandler(member);
优点:
将请求与处理解耦。
请求处理者(节点对象)只需关注自己感兴趣的请求进行处理,对于不感兴趣的请求,直接转发给下一级节点对象。
具备链式传递处理请求功能,请求发送者无需知晓链路结构,只需等待请求处理结果。
链路结构灵活,可以通过改变链路结构动态地新增或删减责任。
易于扩展新的请求处理类(节点),符合开闭原则。
缺点:
责任链太长或者处理时间过长,会影响整体性能。
如果节点对象存在循环引用时,会造成死循环,导致系统崩溃。