很多项目中都有用到责任链模式,比如Tomcat,还有Spring,Filter和拦截器都算是
责任链模式通常都是将实现类包装成Handler对象或者重写对应的Handler方法,然后把对应的Handler收集到一个数组或者是链表,然后最终执行所有Handler
一个场景,业务中我们需要校验很多数据和权限
通常我们
javaif(...)
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 许可协议。转载请注明出处!