定义:
责任链模式(Chain of Responsibility): 使多个对象都有机会处理同一请求,从而避免请求的发送者和接受者之间的耦合关系,每个对象都是一个处理节点,将这些对象连成一条链,并沿着这条链传递该请求。
原始概念中,是直到链上的某个接收对象能够处理它为止。
实际使用中,链上的所有对象都可以对请求进行特殊处理。
代码:
定义接口:
public interface Handler {
public void exec(User user);
}
定义抽象类继承接口,并且在抽象类中编写公共方法
public abstract class AbstractHandler implements Handler {
public AbstractHandler next;
public void next(AbstractHandler next){
this.next = next;
}
public static Builder builder(){
return new Builder();
}
public static class Builder{
private AbstractHandler head;
private AbstractHandler tail;
public Builder addHandler(AbstractHandler handler){
//如果头节点是空,赋值处理器
if (this.head == null){
this.head = handler;
this.tail = handler;
return this;
}
//头节点不是空,将传来的处理器赋值个上一个节点d的next
this.tail.next(handler);
//将传来的处理器加到尾部,以便于下一个处理器在进行处理
this.tail = handler;
return this;
}
public AbstractHandler build(){
return this.head;
}
}
}
定义具体校验规则:
public class NameHandler extends AbstractHandler {
@Override
public void exec(User user) {
if (user.getName() == null){
System.out.println("用户名是空");
return;
}
if (next != null){
next.exec(user);
}
}
}
public class PassWordHandler extends AbstractHandler {
@Override
public void exec(User user) {
if (user.getPassWord() == null || !Objects.equals(user.getPassWord(),"666")){
System.out.println("密码不正确");
}
}
}
测试
public class HandlerTest {
public static void main(String[] args) {
/**
* 责任链模式进行数据多重校验,根据处理器的构造顺序进行顺序校验
* 还可以应用于处理不同类型的数,user中存在type,根据type进行判断再某一个节点,如果再此节点进行小狐狸
* 不在此节点进行下一节点处理,知道招找到处理器处理
*/
User user = new User();
user.setName("zs");
user.setPassWord("111");
Handler build = AbstractHandler.builder()
.addHandler(new NameHandler())
.addHandler(new PassWordHandler())
.build();
build.exec(user);
}
}
扩展使用:
除了校验,还可以用于根据接受数据不同类型的分别在不同类中处理相应的数据
比如事件处理系统:在一个事件驱动的系统中,可能需要对不同类型的事件进行不同 的处理。责任链模式可以用来创建一个事件处理器链,每个处理器负责处理特定 类型的事件,并将事件传递给下一个处理器。这样可以确保系统的可扩展性和灵 活性。
结合springBoot应用:
将构建加入到配置类中:
Handler build = AbstractHandler.builder()
.addHandler(new NameHandler())
.addHandler(new PassWordHandler())
.build();
使用时候直接从容器中拿到Handler,调用exec()方法即可
标签:多重,校验,AbstractHandler,处理器,user,节点,next,public,技能 From: https://blog.csdn.net/m0_73363097/article/details/140076634