java责任链模式优化代码结构
1.责任链模式定义
责任链模式(Iterator Pattern), 是行为型设计模式之一。把每个节点可以看做一个对象,每个对象有不同的处理逻辑,将一个请求从链的首端发出,沿着链的路径依次传递每个节点对象,直到有对象处理这个请求为止,我们将这样一种模式称为责任链模式。
2.责任链模式的应用场景 之前在做需求,写一个方法,先在前面做验证,
-
if不满足A条件则return, if不满足B条件则return… 一共写了5个验证,等验证通过以后才执行下面的逻辑, 过了一阵产品提了需求,跟这个方法类似, 我又把这个方法copy了一份,只不过验证条件稍微有点不一样,变成6个验证了。
2.java责任链模式极简单版实现
import lombok.Data; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; public class SimpleVersion { public static void main(String[] args) { BlockingQueue queue = new LinkedBlockingQueue<Handler>(10); queue.offer(new OneHandler()); queue.offer(new TwoHandler()); queue.offer(new FourHandler()); queue.offer(new ThreeHandler()); User user = new User(); user.setUserName("lin"); user.setPassWord("6661"); try { while (true){ Handler take = (Handler) queue.take(); if(!take.doHandler(user)){ return; } } }catch (Exception e){ } } } abstract class Handler<T> { /** * 这里模拟责任链模式需要完成的操作,后续所有的操作都需要实现这个方法 */ public abstract Boolean doHandler(User user); } class OneHandler extends Handler { @Override public Boolean doHandler(User user) { if(!"lin".equals(user.getUserName())){ System.out.println("未通过第一道校验" + this.getClass().getName()); return false; } System.out.println("通过第一道校验" + this.getClass().getName()); return true; } } class TwoHandler extends Handler { @Override public Boolean doHandler(User user) { if(!"666".equals(user.getPassWord())){ System.out.println("未通过第二道校验" + this.getClass().getName()); return false; } System.out.println("通过第二道校验" + this.getClass().getName()); return true; } } class ThreeHandler extends Handler { @Override public Boolean doHandler(User user) { //依据业务,添加其他条件 if(false){ System.out.println("未通过第三道校验" + this.getClass().getName()); return false; } System.out.println("通过第三道校验" + this.getClass().getName()); return true; } } class FourHandler extends Handler { @Override public Boolean doHandler(User user) { //依据业务,添加其他条件 if(false){ System.out.println("未通过第四道校验" + this.getClass().getName()); return false; } System.out.println("通过第四道校验" + this.getClass().getName()); return true; } } @Data class User { private String userName; private String passWord; private String roleName; }