责任链模式包含以下几个角色:java
● Handler(抽象处理者):它定义了一个处理请求的接口,通常设计为抽象类,因为不一样的具体处理者处理请求的方式不一样,所以在其中定义了抽象请求处理方法。由于每个处理者的下家仍是一个处理者,所以在抽象处理者中定义了一个抽象处理者类型的对象(如结构图中的successor),做为其对下家的引用。经过该引用,处理者能够连成一条链。 ● ConcreteHandler(具体处理者):它是抽象处理者的子类,能够处理用户请求,在具体处理者类中实现了抽象处理者中定义的抽象请求处理方法,在处理请求以前须要进行判断,看是否有相应的处理权限,若是能够处理请求就处理它,不然将请求转发给后继者;在具体处理者中能够访问链中下一个对象,以便请求的转发。
一、主要优势性能
(1) 责任链模式使得一个对象无须知道是其余哪个对象处理其请求,对象仅需知道该请求会被处理便可,接收者和发送者都没有对方的明确信息,且链中的对象不须要知道链的结构,由客户端负责链的建立,下降了系统的耦合度。 (2) 请求处理对象仅需维持一个指向其后继者的引用,而不须要维持它对全部的候选处理者的引用,可简化对象的相互链接。 (3) 在给对象分派职责时,责任链能够给咱们更多的灵活性,能够经过在运行时对该链进行动态的增长或修改来增长或改变处理一个请求的职责。 (4) 在系统中增长一个新的具体请求处理者时无须修改原有系统的代码,只须要在客户端从新建链便可,从这一点来看是符合“开闭原则”的。
二、主要缺点测试
(1) 因为一个请求没有明确的接收者,那么就不能保证它必定会被处理,该请求可能一直到链的末端都得不处处理;一个请求也可能因责任链没有被正确配置而得不处处理。 (2) 对于比较长的责任链,请求的处理可能涉及到多个处理对象,系统性能将受到必定影响,并且在进行代码调试时不太方便。 (3) 若是建链不当,可能会形成循环调用,将致使系统陷入死循环。
三、适用场景this
(1) 有多个对象能够处理同一个请求,具体哪一个对象处理该请求待运行时刻再肯定,客户端只需将请求提交到链上,而无须关心请求的处理对象是谁以及它是如何处理的。 (2) 在不明确指定接收者的状况下,向多个对象中的一个提交一个请求。 (3) 可动态指定一组对象处理请求,客户端能够动态建立责任链来处理请求,还能够改变链中处理者之间的前后次序
王者荣耀中的责任链模式(段位):设计
/** * 2018/12/6 * 抽象处理者 * * @author machuanpeng */ public abstract class Handler { //维持对下家的引用 protected Handler successor; public void setSuccessor(Handler successor) { this.successor=successor; } public abstract void handleRequest(int star); }
/** * 2018/12/6 * 青铜具体处理者 * * @author machuanpeng */ public class QingTongHandler extends Handler { public void handleRequest(int star) { if (star<10) { System.out.print("青铜段位"); } else { //转发请求 this.successor.handleRequest(star); } } }
/** * 2018/12/6 * 白银具体处理者 * * @author machuanpeng */ public class BaiYinHandler extends Handler { public void handleRequest(int star) { if (star<25) { System.out.print("白银段位"); } else { //转发请求 this.successor.handleRequest(star); } } }
/** * 2018/12/6 * 其余具体处理者 * * @author machuanpeng */ public class QiTaHandler extends Handler { public void handleRequest(int star) { System.out.print("其余段位"); } }
测试:调试
public class Client { public static void main(String args[]) { Handler qingTong = new QingTongHandler(); Handler baiYin = new BaiYinHandler(); Handler qiTa = new QiTaHandler(); qingTong.setSuccessor(baiYin); baiYin.setSuccessor(qiTa); qingTong.handleRequest(9); qingTong.handleRequest(20); qingTong.handleRequest(30); } }