一、责任链模式定义
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.如果节点对象存在循环引用时,会造成死循环,导致系统崩溃