一、责任链模式定义

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

2.责任链模式的应用场景

  A.多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定

  B.在不明确指定接收者的情况下,向多个对象中的一个提交一个请求

  C.可动态指定一组对象处理请求

二、责任链模式示例

1.责任链模式主要包含两种角色:

  A.抽象处理者(Handler):定义一个请求处理的方法,并维护一个下一个处理节点Handler对象的引用

  B.具体处理者(ConcreteHandler):对请求进行处理,如果不感兴趣,则进行转发

2.责任链模式的本质是解耦请求与处理,让请求在处理链中能进行传递与被处理;理解责任链模式应当理解的是其模式(道)而不是其具体实现(术),责任链模式的独到之处是其将节点处理者组合成了链式结构,并允许节点自身决定是否进行请求处理或转发,相当于让请求流动了起来

3.代码示例

  1 public class Member {
  2 
  3     private String loginName;
  4     private String loginPass;
  5     private String roleName;
  6 
  7     public Member(String loginName, String loginPass) {
  8         this.loginName = loginName;
  9         this.loginPass = loginPass;
 10     }
 11 
 12     public String getLoginName() {
 13         return loginName;
 14     }
 15 
 16     public void setLoginName(String loginName) {
 17         this.loginName = loginName;
 18     }
 19 
 20     public String getLoginPass() {
 21         return loginPass;
 22     }
 23 
 24     public void setLoginPass(String loginPass) {
 25         this.loginPass = loginPass;
 26     }
 27 
 28     public String getRoleName() {
 29         return roleName;
 30     }
 31 
 32     public void setRoleName(String roleName) {
 33         this.roleName = roleName;
 34     }
 35 }
 36 
 37 public abstract class Handler {
 38 
 39     protected Handler chain;
 40 
 41     public void next(Handler handler){
 42         this.chain = handler;
 43     }
 44 
 45     public abstract void doHandle(Member member);
 46 }
 47 
 48 public class ValidateHandler extends Handler {
 49     @Override
 50     public void doHandle(Member member) {
 51         if(StringUtils.isEmpty(member.getLoginName()) || StringUtils.isEmpty(member.getLoginPass())){
 52             System.out.println("用户名或密码为空");
 53             return;
 54         }
 55         System.out.println("用户名和密码校验成功,可以往下执行");
 56         chain.doHandle(member);
 57     }
 58 }
 59 
 60 public class LoginHandler extends Handler {
 61     @Override
 62     public void doHandle(Member member) {
 63         System.out.println("登录成功");
 64         member.setRoleName("管理员");
 65         chain.doHandle(member);
 66     }
 67 }
 68 
 69 public class AuthHandler extends Handler {
 70     @Override
 71     public void doHandle(Member member) {
 72         if(!"管理员".equals(member.getRoleName())){
 73             System.out.println("您不是管理员,没有操作权限");
 74             return;
 75         }
 76         System.out.println("您是管理员,允许操作");
 77     }
 78 }
 79 
 80 
 81 public class MemberService {
 82     public void login(String loginName, String loginPass){
 83         Handler validateHandler = new ValidateHandler();
 84         Handler loginHandler = new LoginHandler();
 85         Handler authHandler = new AuthHandler();
 86 
 87         validateHandler.next(loginHandler);
 88         loginHandler.next(authHandler);
 89 
 90         validateHandler.doHandle(new Member(loginName, loginPass));
 91     }
 92 }
 93 
 94 
 95 public class ResponsibilityChainTest {
 96     public static void main(String[] args) {
 97         MemberService memberService = new MemberService();
 98         memberService.login("tom", "666");
 99     }
100 }

4.责任链模式的优缺点

  A.优点

    a.将请求与处理解耦

    b.请求处理者(节点对象)只需关注自己感兴趣的请求进行处理即可,对于不感兴趣的请求,直接转发给下一级节点对象

    c.具备链式传递处理请求功能,请求发送者无需知晓链路结构,只需等待请求处理结果

    d.链路结构灵活,可以通过改变链路结构动态的新增或删减责任

    e.易于扩展新的请求处理类(节点),符合开闭原则

  B.缺点

    a.责任链太长或处理时间过长,会影响整体性能

    b.如果节点对象存在循环引用时,会造成死循环,导致系统崩溃