Java责任链模式 Java设计模式之责任链模式详解
yyangqqian 人气:0想了解Java设计模式之责任链模式详解的相关内容吗,yyangqqian在本文为您仔细讲解Java责任链模式的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:Java责任链模式,Java设计模式,下面大家一起来学习吧。
一、前言
各个部门协同合作完成一个任务,每个部门都有各自的职责,一个部门完成后,变回转交给下一个部门,直到所有部门都处理了,这个任务才完成。
将请求与处理解耦。
处理者只需要关注自己感兴趣的请求进行处理,对于不感兴趣的请求,直接转发给下一个节点对象。
二、登录校验举例。
1、校验用户名或密码是否为空。
2、校验用户名是否存在。
3、校验是否有权限。
@Data public class Member { private String loginName; private String loginPass; private String roleName; public Member(String loginName, String loginPass) { this.loginName = loginName; this.loginPass = loginPass; } }
传统编码,在同一个方法里一个一个进行判断。
public class MemberService { public void login(String loginName, String loginPass) { if (StringUtils.isEmpty(loginName) || StringUtils.isEmpty(loginPass)) { System.out.println("用户名或密码不为空,校验失败"); return; } System.out.println("用户名、密码校验成功"); if (!"James".equals(loginName)) { System.out.println("用户不存在"); return; } Member member = new Member(); member.setRoleName("管理员"); if (!"管理员".equals(member.getRoleName())) { System.out.println("您不是管理员,没有权限"); return; } System.out.println("登录成功"); } public static void main(String[] args) { MemberService memberService = new MemberService(); memberService.login("Ja1mes", "null"); } }
使用责任链和建造者结合模式,将每个步骤处理连起来。
抽象出处理类。
public abstract class Handler<T> { // 指向下一个处理类 protected Handler chain; // 设置下一个处理类 public void next(Handler handler) { this.chain = handler; } // 具体处理逻辑 public abstract void doHandler(Member member); // 构建一条链式处理逻辑 public static class Builder<T> { // 第一个处理类 private Handler<T> head; // 最后一个处理类 private Handler<T> tail; // 从头开始添加处理类 public Builder<T> addHandler(Handler<T> handler) { if (this.head == null) { // 只有一个处理类,所以不需要设置下一个处理类 this.head = this.tail = handler; return this; } // 设置下一个处理类 this.tail.next(handler); // 尾部设置为下一个处理类的引用 this.tail = handler; return this; } // 返回的是第一个处理类 public Handler<T> builder() { return this.head; } } }
具体实现三个处理类,来进行分别校验
public class ValidateHandler extends Handler { @Override public void doHandler(Member member) { if (StringUtils.isEmpty(member.getLoginName()) || StringUtils.isEmpty(member.getLoginPass())) { System.out.println("用户名或密码不为空,校验失败"); return; } System.out.println("用户名、密码校验成功"); chain.doHandler(member); } } public class LoginHandler extends Handler { @Override public void doHandler(Member member) { if (!"James".equals(member.getLoginName())){ System.out.println("用户名不存在"); return; } System.out.println("登录成功"); member.setRoleName("管理员"); chain.doHandler(member); } } public class AuthHandler extends Handler { @Override public void doHandler(Member member) { if (!"管理员".equals(member.getRoleName())) { System.out.println("您不是管理员,没有权限"); return; } System.out.println("您是管理员,允许操作"); } }
public class MemberService { public void login(String loginName, String loginPass) { // 构建一条链式处理 Handler.Builder builder = new Handler.Builder() .addHandler(new ValidateHandler()) .addHandler(new LoginHandler()) .addHandler(new AuthHandler()); // 从第一个处理类执行到最后一个处理类 builder.builder().doHandler(new Member("James11", "1234")); } public static void main(String[] args) { MemberService memberService = new MemberService(); memberService.login("Ja1mes", "1234"); } }
三、Spring使用的责任链模式
过滤器,可以配置多个过滤器来干不同的事情,然后一个一个执行。
FilterChain。
加载全部内容