Chain of responsibility pattern is used to achieve loose coupling in software design where a request from the client is passed to a chain of objects to process them. Later, the object in the chain will decide themselves who will be processing the request and whether the request is required to be sent to the next object in the chain or not.
前言 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
责任链模式 基本介绍:
1) 职责链模式(Chain of Responsibility Pattern),又叫 责任链模式,为请求创建了一个 接收者对象的 链( 简单示意图) 。这种模式对请求的发送者和接收者进行解耦; 2) 职责链模式通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推; 3) 这种类型的设计模式属于行为型模式
角色介绍:
1) Handler : 抽象的处理者, 定义了一个处理请求的接口, 同时含义另外Handler; 2) ConcreteHandlerA , B 是具体的处理者, 处理它自己负责的请求, 可以访问它的后继者(即下一处 理者), 如果可以处理当前请求,则处理,否则就将该请求交个 后继者去处理,从而形成一个职责链; 3) Request , 含义很多属性,表示一个请求。
责任链模式-UML图:
责任链模式-实例图:
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 public class Chainofresponsibility { public static void main (String[] args) { ProgramApe ape = new ProgramApe((int ) (Math.random() * 30000 )); GroupLeader leader = new GroupLeader(); Director director = new Director(); Manager manager = new Manager(); Boss boss = new Boss(); if (ape.getExpenses() <= 1000 ) { leader.handleRequest(ape); } else if (ape.getExpenses() <= 5000 ) { director.handleRequest(ape); } else if (ape.getExpenses() <= 10000 ) { manager.handleRequest(ape); } else { boss.handleRequest(ape); } } } class SimpleResponsibility { public static void main (String[] args) { int request = (int ) (Math.random() * 3 ); switch (request) { case 0 : System.out.println("SMBother handle it: " + request); break ; case 1 : System.out.println("Aige handle it: " + request); break ; case 2 : System.out.println("7Bother handle it: " + request); break ; default : break ; } } } class ProgramApe { private int expenses; private String apply = "爹要点钱出差" ; public ProgramApe (int expenses) { this .expenses = expenses; } public int getExpenses () { return expenses; } public String getApply () { return apply; } } class GroupLeader { public void handleRequest (ProgramApe ape) { System.out.println(ape.getApply()); System.out.println("GroupLeader: Of course Yes!" ); } } class Director { public void handleRequest (ProgramApe ape) { System.out.println(ape.getApply()); System.out.println("Director: Of course Yes!" ); } } class Manager { public void handleRequest (ProgramApe ape) { System.out.println(ape.getApply()); System.out.println("Manager: Of course Yes!" ); } } class Boss { public void handleRequest (ProgramApe ape) { System.out.println(ape.getApply()); System.out.println("Boss: Of course Yes!" ); } }
总结 责任链模式的注意事项和细节:
1) 将请求和处理分开,实现解耦,提高系统的灵活性; 2) 简化了对象,使对象不需要知道链的结构; 3) 性能会受到影响,特别是在链比较长的时候,因此需控制链中最大节点数量,一般通过在Handler中设置一个最大节点数量,在setNext()方法中判断是否已经超过阀值,超过则不允许该链建立,避免出现超长链无意识地破坏系统性能; 4) 调试不方便。采用了类似递归的方式,调试时逻辑可能比较复杂 5) 最佳应用场景:有多个对象可以处理同一个请求时,比如:多级请求、请假/加薪等审批流程、Java Web中Tomcat对Encoding的处理、拦截器。
延伸 责任链模式-菜鸟教程 Java设计模式 - 责任链模式 行为型设计模式-责任链模式 Chain of Responsibility Design Pattern 尚硅谷Java设计模式,韩顺平图解java设计模式