行为型设计模式之责任链模式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了行为型设计模式之责任链模式相关的知识,希望对你有一定的参考价值。
责任链模式
应用场景
适用场景:
1.多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定。
2.在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
3.可动态指定一组对象处理请求。
优缺点
优点:
1.将请求与处理解耦
2.请求处理者(节点对象)只需关注自己感兴趣的请求进行处理即可,对于不感兴趣的请求,直接转发给下一级节点对象
3.具备链式传递处理请求功能,请求发送者无需知晓链路结构,只需等待请求处理结果
4.链路结构灵活,可以通过改变链路结构动态地新增或删减责任
5.易于扩展新的请求处理类(节点),符合开闭原则
缺点:
1.责任链太长或者处理时间过长,会影响整体性能
2.如果节点对象存在循环引用时,会造成死循环,导致系统崩溃
主要角色
1.抽象处理者(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用户有权限,登录成功
以上是关于行为型设计模式之责任链模式的主要内容,如果未能解决你的问题,请参考以下文章