阿里云网站建设,装修方案,哈尔滨网站建设信息,网站icp备案什么是职责链模式 职责链模式是避免请求发送者与接受者耦合在一起#xff0c;让多个对象都可以接受到请求#xff0c;从而将这些对象连接成一条链#xff0c;并且沿着这条链传递请求#xff0c;直到有对象处理为止。 职责链模式包含以下几个角色#xff1a; …什么是职责链模式 职责链模式是避免请求发送者与接受者耦合在一起让多个对象都可以接受到请求从而将这些对象连接成一条链并且沿着这条链传递请求直到有对象处理为止。 职责链模式包含以下几个角色 Handler(抽象处理者)定义处理请求的接口一般是抽象类。由于不同的具体处理类处理请求的方式不同因此在其中定义抽象处理请求的方法。因为每一个处理这的下家还是处理者因此在抽象处理者中定义一个抽象处理者类型的对象作为下家的引用。 ConcreteHandler(具体处理者)是抽象处理者的子类实现了抽象处理者中定义的抽象方法用于处理用户请求。具体处理者有两大作用一是处理请求不同的具体处理者以不同的形式实现抽象处理者的方法。二是转发请求当前处理类可将请求转发给下家。 职责链模式可以分为纯的职责链模式和不纯的职责链模式 纯的职责链模式要求具体处理者只能在两个行为中选择一个要么承担全部责任要么将责任转发给下家不允许出现一个具体处理者承担了一部分或全部责任还要将责任转发给下家。 不纯的职责链模式允许请求被一个具体处理者处理部分或全部后在转发给下家也可以不被任何处理者所处理。
职责链模式的优缺点
优点 一个对象无需知道是其他哪个对象处理请求降低了系统耦合。请求处理对象只需维护一个指向下家的的引用简化对象的相互连接。给对象分派职责时更加灵活可以通过在运行时对该链进行动态增加或修改改变处理请求的职责。增加新的处理请求时无需修改代码符合开闭原则。
缺点 不保证每个请求都会被处理。太长的职责链涉及更多的处理对象会降低系统性能。可能会造成循环调用陷入死循环。
职责链模式的应用场景 有多个对象可以处理同一个请求具体哪个对象处理在运行时决定。不明确接受者的情况下向多个对象中的一个提交请求。可动态指定一组对象处理请求客户端可以动态创建职责链处理请求还可以改变处理请求的顺序。
职责链模式的案例 // 请求对象
public class PurchaseRequest implements Serializable {private int type 0;private float price 0.0f;private int id 0;}// 抽象处理者
public abstract class Approver {Approver approver;String name;public Approver(String name) {this.name name;}public void setApprover(Approver approver) {this.approver approver;}public abstract void processRequest(PurchaseRequest purchaseRequest);}// 具体处理者
public class CollegeApprover extends Approver {public CollegeApprover(String name) {super(name);}Overridepublic void processRequest(PurchaseRequest purchaseRequest) {if (purchaseRequest.getPrice() 5000 purchaseRequest.getPrice() 10000) {System.out.println( 请求编号 id purchaseRequest.getId() 被 this.name 处理);} else {approver.processRequest(purchaseRequest);}}
}public class DepartmentApprover extends Approver {public DepartmentApprover(String name) {super(name);}Overridepublic void processRequest(PurchaseRequest purchaseRequest) {if (purchaseRequest.getPrice() 5000) {System.out.println( 请求编号 id purchaseRequest.getId() 被 this.name 处理);} else {approver.processRequest(purchaseRequest);}}}public class SchoolMasterApprover extends Approver {public SchoolMasterApprover(String name) {super(name);}Overridepublic void processRequest(PurchaseRequest purchaseRequest) {if (purchaseRequest.getPrice() 30000) {System.out.println( 请求编号 id purchaseRequest.getId() 被 this.name 处理);} else {approver.processRequest(purchaseRequest);}}
}public class ViceSchoolMasterApprover extends Approver {public ViceSchoolMasterApprover(String name) {super(name);}Overridepublic void processRequest(PurchaseRequest purchaseRequest) {if (purchaseRequest.getPrice() 10000 purchaseRequest.getPrice() 30000) {System.out.println( 请求编号 id purchaseRequest.getId() 被 this.name 处理);} else {approver.processRequest(purchaseRequest);}}
} 职责链模式在源码中的应用
org.apache.ibatis.plugin.InterceptorChain // 在mybatis源码中添加拦截器就是使用责任链模式
// pluginAll 通过这个方法可以添加定义好的拦截器实现
// 通过遍历 getInterceptors 就可以去请求每一个定义好的拦截器类
public class InterceptorChain {private final ListInterceptor interceptors new ArrayList();public Object pluginAll(Object target) {for (Interceptor interceptor : interceptors) {target interceptor.plugin(target);}return target;}public void addInterceptor(Interceptor interceptor) {interceptors.add(interceptor);}public ListInterceptor getInterceptors() {return Collections.unmodifiableList(interceptors);}}