当前位置:   article > 正文

Java设计模式——责任链模式

Java设计模式——责任链模式

当一个请求需要在多个对象之间传递,每个对象都可能处理该请求或将其传递给下一个对象。在这种情况下,需要避免将发送者与接收者之间的耦合,以及确定请求的处理方式。此时可使用责任链模式,它的优点有降低耦合度(无需关心哪个对象会处理请求),灵活性(可以动态地改变它们之间的顺序和职责),可扩展性(添加新的处理者,而不会影响现有代码),可维护性(处理者之间职责分开,便于维护);责任链模式也有限制,比如可能导致请求无法被处理或者处理链太长而导致性能问题。

一、抽象类方式实现
假定一个权限认证的例子

  1. /**
  2. * 成员类
  3. */
  4. @Getter
  5. @ToString
  6. public class Member {
  7. private String loginName;
  8. private String loginPass;
  9. @Setter
  10. private String roleName;
  11. public Member(String loginName, String loginPass) {
  12. this.loginName = loginName;
  13. this.loginPass = loginPass;
  14. }
  15. }
  16. /**
  17. * 抽象处理者
  18. */
  19. public abstract class Handler {
  20. protected Handler handler;
  21. public void next(Handler handler) {
  22. this.handler = handler;
  23. }
  24. public abstract void doHandler(Member member);
  25. }
  26. /**
  27. * 认证处理器
  28. */
  29. public class AuthHandler extends Handler {
  30. @Override
  31. public void doHandler(Member member) {
  32. if (!"管理员".equals(member.getRoleName())) {
  33. System.out.println("无操作权限!");
  34. return;
  35. }
  36. System.out.println("操作成功,管理员同志");
  37. }
  38. }
  39. /**
  40. * 登陆处理器
  41. */
  42. public class LoginHandler extends Handler {
  43. @Override
  44. public void doHandler(Member member) {
  45. System.out.println("登陆成功!");
  46. member.setRoleName("管理员");
  47. handler.doHandler(member);
  48. }
  49. }
  50. /**
  51. * 校验数据处理器
  52. */
  53. public class ValidDataHandler extends Handler {
  54. @Override
  55. public void doHandler(Member member) {
  56. if (StringUtils.isBlank(member.getLoginName()) || StringUtils.isBlank(member.getLoginPass())) {
  57. System.out.println("用户名或密码不能为空!");
  58. return;
  59. }
  60. System.out.println("验证通过!");
  61. handler.doHandler(member);
  62. }
  63. }
  64. /**
  65. * 业务服务类
  66. */
  67. public class MemberService {
  68. public void login(String loginName, String loginPass) {
  69. Handler validDateHandler = new ValidDataHandler();
  70. Handler loginHandler = new LoginHandler();
  71. Handler authHandler = new AuthHandler();
  72. validDateHandler.next(loginHandler);
  73. loginHandler.next(authHandler);
  74. validDateHandler.doHandler(new Member(loginName, loginPass));
  75. }
  76. }

编写测试用例

  1. /**
  2. * 责任链模式-权限认证测试
  3. */
  4. @Test
  5. public void testPermission() {
  6. MemberService memberService = new MemberService();
  7. memberService.login("admin", "123456");
  8. }

二、与建造者模式相结合

还是权限认证的例子

  1. /**
  2. * 抽象处理者(结合建造者模式)
  3. */
  4. public abstract class HandlerUp {
  5. protected HandlerUp handler;
  6. public void next(HandlerUp handler) {
  7. this.handler = handler;
  8. }
  9. public abstract void doHandler(Member member);
  10. public static class Builder {
  11. private HandlerUp head;
  12. private HandlerUp tail;
  13. public Builder addHandler(HandlerUp handler) {
  14. if (this.head == null) {
  15. this.head = this.tail = handler;
  16. return this;
  17. }
  18. this.tail.next(handler);
  19. this.tail = handler;
  20. return this;
  21. }
  22. public HandlerUp build() {
  23. return this.head;
  24. }
  25. }
  26. }
  27. /**
  28. * 认证处理器
  29. */
  30. public class AuthHandlerUp extends HandlerUp {
  31. @Override
  32. public void doHandler(Member member) {
  33. if (!"管理员".equals(member.getRoleName())) {
  34. System.out.println("非管理员,无操作权限!");
  35. return;
  36. }
  37. System.out.println("操作成功,管理员同志");
  38. }
  39. }
  40. /**
  41. * 登陆处理器
  42. */
  43. public class LoginHandlerUp extends HandlerUp {
  44. @Override
  45. public void doHandler(Member member) {
  46. System.out.println("登陆成功!");
  47. member.setRoleName("管理员");
  48. handler.doHandler(member);
  49. }
  50. }
  51. /**
  52. * 校验数据处理器
  53. */
  54. public class ValidDataHandlerUp extends HandlerUp {
  55. @Override
  56. public void doHandler(Member member) {
  57. if (StringUtils.isBlank(member.getLoginName()) || StringUtils.isBlank(member.getLoginPass())) {
  58. System.out.println("用户名或密码不能为空!");
  59. return;
  60. }
  61. System.out.println("用户名和密码校验成功!");
  62. handler.doHandler(member);
  63. }
  64. }
  65. /**
  66. * 业务服务类
  67. */
  68. public class MemberServiceUp {
  69. public void login(String loginName, String loginPass) {
  70. new HandlerUp.Builder()
  71. .addHandler(new ValidDataHandlerUp())
  72. .addHandler(new LoginHandlerUp())
  73. .addHandler(new AuthHandlerUp())
  74. .build()
  75. .doHandler(new Member(loginName, loginPass));
  76. }
  77. }

编写测试用例

  1. /**
  2. * 责任链模式-权限认证(增强版)测试
  3. */
  4. @Test
  5. public void testPermissionUp() {
  6. MemberServiceUp memberServiceUp = new MemberServiceUp();
  7. memberServiceUp.login("admin", "123456");
  8. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/146379
推荐阅读
相关标签
  

闽ICP备14008679号