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;
}