编辑
2024-04-09
Java
00
请注意,本文编写于 395 天前,最后修改于 395 天前,其中某些信息可能已经过时。

很多项目中都有用到责任链模式,比如Tomcat,还有Spring,Filter和拦截器都算是

责任链模式通常都是将实现类包装成Handler对象或者重写对应的Handler方法,然后把对应的Handler收集到一个数组或者是链表,然后最终执行所有Handler

一个场景,业务中我们需要校验很多数据和权限

通常我们

java
if(...) if(...) if(...) ........

我们怎么用责任链模式实现呢?

定义一个抽象类

java
public abstract class Handler<T> { // 声明一个下一个处理器的引用 protected Handler next; // 设置下一个处理器的方法 private void next(Handler next) { this.next = next; } // 抽象方法,由子类实现具体的处理逻辑 public abstract void doHandler(Member member); // 静态内部类 Builder,用于构建 Handler 链 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; } } }

然后实现很多的Handler子类

java
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 (!"jack".equals(member.getUsername()) || !"666".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 (!"管理员".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("执行业务逻辑。。"); } } ......... public class Test { public static void main(String[] args) { Handler.Builder builder = new Handler.Builder(); //这里就是链式编程,谁在前谁在后看的清清楚楚,明明白白 builder.addHandler(new ValidateHandler()) .addHandler(new LoginHandler()) .addHandler(new AuthHandler()) .addHandler(new BusinessLogicHandler()); Member member = new Member(); member.setUsername(""); member.setPassword(""); builder.build().doHandler(member); } }

不过却是Duck不必,但是帮我们了解原理还是很可以的

本文作者:yowayimono

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!