网站正在建设源码,北京学会网站建设,石家庄做的好的网站,论坛创建责任链模式#xff08;Chain of Responsibility Pattern#xff09;是一种行为设计模式#xff0c;它允许你将请求沿着处理者链进行传递#xff0c;直到有一个处理者能够处理该请求。 在责任链模式中#xff0c;多个处理者对象被连接成一个链。当接收到一个请求时#xf…责任链模式Chain of Responsibility Pattern是一种行为设计模式它允许你将请求沿着处理者链进行传递直到有一个处理者能够处理该请求。 在责任链模式中多个处理者对象被连接成一个链。当接收到一个请求时每个处理者会判断自己是否有能力来处理该请求如果可以处理则直接处理如果不能处理则将请求传递给链中的下一个处理者。这样请求就会依次经过整个链直到找到一个合适的处理者处理请求或者请求到达链的末端仍然没有处理者能够处理。
责任链模式适用于以下场景
请求需要被多个对象处理当一个请求需要经过多个对象的处理时可以使用责任链模式。每个对象都能够判断自己是否能够处理该请求从而实现责任的分担和协作。需要动态指定处理对象通过将处理者对象组织成一个链可以在运行时动态地指定处理请求的对象集合。这样可以灵活地增加或删除处理者并且不影响客户端代码。可以按照顺序执行处理步骤如果有一系列相关的处理步骤需要按照特定的顺序执行可以使用责任链模式。每个处理者只负责完成自己的处理步骤从而简化了客户端代码并且提高了代码的可维护性。需要避免请求发送者和接收者之间的耦合责任链模式通过将请求发送者和接收者解耦使得发送者不需要知道是哪个具体处理者来处理请求。这样可以降低系统的耦合度并提高代码的灵活性。有时候需要在处理请求之前进行预处理或后处理操作责任链模式可以方便地在处理请求之前或之后进行其他操作例如日志记录、数据统计等。 责任链模式适用于在处理对象之间存在松散耦合、需要动态指定处理对象并且能够按照特定顺序执行处理步骤的情况下使用。当然具体是否使用责任链模式还要根据具体问题的需求和限制来决定。
责任链模式的主要角色
在责任链模式中每个具体处理者都有可能处理请求也有可能将请求转发给链中的下一个处理者。这样在调用方和具体处理者之间形成了一条职责链请求会按照职责链上的顺序依次传递直到有一个处理者能够处理请求或者职责链的末端没有处理者能够处理请求时结束。通过动态地组织处理者对象责任链模式可以灵活地处理请求并且能够简化代码结构。
抽象处理者Handler定义一个接口声明了处理请求的方法并且可以拥有一个指向下一处理者的引用。该角色可以是抽象类或接口。具体处理者Concrete Handler实现抽象处理者接口对请求进行具体的处理。如果自己无法处理请求可以将请求转发给下一个处理者。客户端Client创建处理者对象并且将请求发送到处理者链中的第一个处理者对象。客户端通常不关心具体的处理者对象只需要知道链中的第一个处理者。
责任链模式的java代码实例
实现处理一个系统bug由初级程序员到高级程序员到架构师顺级处理 抽象处理者
public interface Handler {/*** 下一个处理者** param handler*/void setNext(Handler handler);/*** 处理bug** param bugLevel* return*/String dealBug(int bugLevel);}具体处理者
/*** 初级程序员*/
public class JuniorProgrammer implements Handler {private Handler nextHandler;Overridepublic void setNext(Handler handler) {this.nextHandler handler;}Overridepublic String dealBug(int bugLevel) {String res ;if (bugLevel 3) {System.out.println(JuniorProgrammer deal this bug!);} else if (nextHandler ! null) {System.out.println(JuniorProgrammer hand over to SeniorProgrammer this bug!);res nextHandler.dealBug(bugLevel);} else {System.out.println(JuniorProgrammer throw this bug!);res bug is throw into the street;}return res;}
}/*** 高级程序员*/
public class SeniorProgrammer implements Handler {private Handler nextHandler;Overridepublic void setNext(Handler handler) {this.nextHandler handler;}Overridepublic String dealBug(int bugLevel) {String res ;if (bugLevel 6) {System.out.println(SeniorProgrammer deal this bug!);} else if (nextHandler ! null) {System.out.println(SeniorProgrammer hand over to Architect this bug!);res nextHandler.dealBug(bugLevel);} else {System.out.println(SeniorProgrammer throw this bug!);res bug is throw into the street;}return res;}}/*** 架构师*/
public class Architect implements Handler {private Handler nextHandler;Overridepublic void setNext(Handler handler) {this.nextHandler handler;}Overridepublic String dealBug(int bugLevel) {String res ;if (bugLevel 8) {System.out.println(Architect deal this bug!);} else if (nextHandler ! null) {System.out.println(Architect hand over to BOSS this bug!);res nextHandler.dealBug(bugLevel);} else {System.out.println(Architect is run!);res bug is throw into the street;}return res;}
}客户端
public static void main(String[] args) {Handler juniorProgrammer new JuniorProgrammer();Handler seniorProgrammer new SeniorProgrammer();Handler architect new Architect();juniorProgrammer.setNext(seniorProgrammer);seniorProgrammer.setNext(architect);System.out.println(juniorProgrammer.dealBug(2));//结果// JuniorProgrammer deal this bug!System.out.println(juniorProgrammer.dealBug(5));//结果// JuniorProgrammer hand over to SeniorProgrammer this bug!// SeniorProgrammer deal this bug!System.out.println(juniorProgrammer.dealBug(9));//结果// JuniorProgrammer hand over to SeniorProgrammer this bug!// SeniorProgrammer hand over to Architect this bug!// Architect is run!// bug is throw into the street}责任链模式的优缺点
责任链模式有以下优点
解耦职责责任链模式可以将请求的发送者与接收者解耦发送者不需要知道具体的接收者是谁而是通过链式传递请求每个处理者只负责处理自己所能处理的请求。灵活性和扩展性可以动态地添加、修改或删除处理者灵活配置责任链满足不同的业务需求。新的请求处理者可以很方便地添加到责任链的末尾同时也可以很容易地拆分或重组责任链。可靠性由于请求在责任链中依次传递每个处理者只负责处理自己所能处理的请求因此可以保证每个请求都会被处理。
责任链模式的缺点包括
请求可能无法被处理如果没有正确地配置责任链或者所有处理者都无法处理某个请求那么该请求可能无法被处理。运行时性能开销由于请求的传递是通过链式调用实现的每个处理者都需要进行判断是否能够处理请求并将请求转发给下一个处理者可能会导致一定的运行时性能开销。可能导致系统复杂性增加过多或过少的处理者以及复杂的处理逻辑可能会导致责任链变得非常复杂增加系统的复杂性。需要仔细设计和管理责任链以确保其简洁、高效。