当前位置 : 主页 > 编程语言 > java >

行为型设计模式之责任链模式

来源:互联网 收集:自由互联 发布时间:2022-09-29
责任链模式 责任链模式(Chain of Responsibility Pattern)属于行为型模式。 它是将链中每一个节点看作是一个对象,每个节点处理的请求均不同,且内部自动维护一个下一节点对象。当一个请

责任链模式

责任链模式(Chain of Responsibility Pattern)属于行为型模式。

它是将链中每一个节点看作是一个对象,每个节点处理的请求均不同,且内部自动维护一个下一节点对象。当一个请求从链式的首端发出时,会沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求为止。

在这里插入图片描述

应用场景

责任链模式主要是解耦请求与处理,客户只需将请求发送到链上即可,无需关心请求的具体内容节,清求会自动进行传递直至有节点对象进行处理

适用场景:

1.多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定。 2.在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。 3.可动态指定一组对象处理请求。

优缺点

优点:

1.将请求与处理解耦 2.请求处理者(节点对象)只需关注自己感兴趣的请求进行处理即可,对于不感兴趣的请求,直接转发给下一级节点对象 3.具备链式传递处理请求功能,请求发送者无需知晓链路结构,只需等待请求处理结果 4.链路结构灵活,可以通过改变链路结构动态地新增或删减责任 5.易于扩展新的请求处理类(节点),符合开闭原则

缺点:

1.责任链太长或者处理时间过长,会影响整体性能 2.如果节点对象存在循环引用时,会造成死循环,导致系统崩溃

主要角色

1.抽象处理者(Handler)

定义一个请求处理的方法,并维护一个下一个处理节点Handler对象的引用

2.具体处理者(ConcreteHandler)

对请求进行处理,如果不感兴趣,则进行转发。

在这里插入图片描述

基本使用

创建抽象处理者

public abstract class Handler { protected Handler nextHandler; public void setNextHanlder(Handler hanlder) { this.nextHandler = hanlder; } public abstract void doHandler(int number); }

创建具体处理者

public class ConcreteHandlerA extends Handler { public void doHandler(int number) { if (number>5){ System.out.println(this.getClass().getSimpleName() + ": 处理任务失败!"); return; } if (this.nextHandler != null) { System.out.println(this.getClass().getSimpleName() + ": 处理任务成功,执行下一个handler"); this.nextHandler.doHandler(number); }else{ System.out.println(this.getClass().getSimpleName() + ": 处理任务成功,没有下一个handler"); } } } public class ConcreteHandlerB extends Handler { public void doHandler(int number) { if (number > 5) { System.out.println(this.getClass().getSimpleName() + ": 处理任务失败!"); return; } if (this.nextHandler != null) { System.out.println(this.getClass().getSimpleName() + ": 处理任务成功,执行下一个handler"); this.nextHandler.doHandler(number); } else { System.out.println(this.getClass().getSimpleName() + ": 处理任务成功,没有下一个handler"); } } }

客户端调用

public static void main(String[] args) { Handler handlerA = new ConcreteHandlerA(); Handler handlerB = new ConcreteHandlerB(); handlerA.setNextHanlder(handlerB); int number = (int) Math.random() * 10; handlerA.doHandler(number); } ConcreteHandlerA: 处理任务成功,执行下一个handler ConcreteHandlerB: 处理任务成功,没有下一个handler

责任链模式实现登录验证

创建抽象处理者

创建user对象

@Data @AllArgsConstructor public class User { private String loginName; private String loginPass; }

创建抽象处理者

public abstract class Handler { protected Handler next; public void next(Handler next){ this.next = next;} public abstract void doHandler(User user); }

创建具体处理者

创建校验Handler,用于校验账号与密码是否非空

public class ValidateHandler extends Handler { public void doHandler(User user) { if (StringUtils.isEmpty(user.getLoginName()) || StringUtils.isEmpty(user.getLoginPass())) { System.out.println("用户名或密码为空"); return; } System.out.println("ValidateHandler执行成功,用户名和密码非空验证通过,继续下一个handler"); next.doHandler(user); } }

校验Handler执行成功后,执行登录Handler,进行账号与密码的校验

public class LoginHandler extends Handler { public void doHandler(User user) { if (user.getLoginName().equals("admin") && user.getLoginPass().equals("123456")) { System.out.println("LoginHandler执行成功,用户名和密码验证通过,继续下一个handler"); next.doHandler(user); } else { System.out.println("用户名或密码错误"); } } }

登录Handler执行成功后,执行鉴权Handler,用于判断是否有权限

public class AuthHandler extends Handler { public void doHandler(User user) { if (!"admin".equals(user.getLoginName())) { System.out.println("用户名不是admin,无权限"); return; } else { System.out.println("admin用户有权限,登录成功"); } } }

客户端执行

public class Test { public static void main(String[] args) { Test.login("Jack","123456"); System.out.println("---------------------------------"); Test.login("admin","123456"); } public static void login(String loginName,String loginPass){ Handler validateHandler = new ValidateHandler(); Handler loginHandler = new LoginHandler(); Handler authHandler = new AuthHandler(); validateHandler.next(loginHandler); loginHandler.next(authHandler); User user = new User(loginName, loginPass); validateHandler.doHandler(user); } } ValidateHandler执行成功,用户名和密码非空验证通过,继续下一个handler 用户名或密码错误 --------------------------------- ValidateHandler执行成功,用户名和密码非空验证通过,继续下一个handler LoginHandler执行成功,用户名和密码验证通过,继续下一个handler admin用户有权限,登录成功
上一篇:Lambda表达式详解
下一篇:没有了
网友评论