本文主要是介绍【设计模式-职责链】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
定义
职责链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它避免请求的发送者与接收者耦合在一起,让多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递请求,直到有对象处理它为止。。这种模式创建了一系列处理对象(通常称为链),每个对象都包含对下一个处理对象的引用。如果一个对象不能处理请求,它会将请求传递给下一个对象,直到链的末端。
组成
- 抽象处理者(Handler):定义了处理请求的接口,通常包括一个处理请求的方法和一个设置下一个处理者的方法。
- 具体处理者(ConcreteHandler):继承自抽象处理者,并实现其接口中的处理请求的方法。如果能够处理请求,处理后终止;否则将请求转发给下一个处理者。
- 客户端(Client):负责将请求发送到链的开头。
UML图
代码
handler接口
/*** @author Shier* CreateTime 2023/5/20 16:04* 处理请求的接口*/
public abstract class Handler {protected Handler successor;/*** 设置继承者* @param successor*/public void setSuccessor(Handler successor) {this.successor = successor;}public abstract void handleRequest(int request);
}
实现 handler接口
/*** @author Shier* CreateTime 2023/5/20 16:06*/
public class ConcreteHandler1 extends Handler {@Overridepublic void handleRequest(int request) {if (request >= 0 && request < 10) {// 当前处理者权限 0 ~ 9System.out.println(this.getClass().getSimpleName() + "处理了请求" + request);} else if (successor != null) {// 转移给下一个处理者successor.handleRequest(request);}}
}/*** @author Shier* CreateTime 2023/5/20 16:06*/
public class ConcreteHandler2 extends Handler {@Overridepublic void handleRequest(int request) {if (request >= 10 && request < 20) {// 当前处理者权限 10 ~ 19System.out.println(this.getClass().getSimpleName() + "处理了请求" + request);} else if (successor != null) {// 转移给下一个处理者successor.handleRequest(request);}}
}
/*** @author Shier* CreateTime 2023/5/20 16:06*/
public class ConcreteHandler3 extends Handler {@Overridepublic void handleRequest(int request) {if (request >= 20 && request < 100) {// 当前处理者权限 20 ~ 99System.out.println(this.getClass().getSimpleName() + "处理了请求" + request);} else if (successor != null) {// 转移给下一个处理者successor.handleRequest(request);}}
}
client
/*** @author Shier* CreateTime 2023/5/20 16:09*/
public class ChainClient {public static void main(String[] args) {ConcreteHandler1 handler1 = new ConcreteHandler1();ConcreteHandler2 handler2 = new ConcreteHandler2();ConcreteHandler3 handler3 = new ConcreteHandler3();// 设置职责链上下关系handler1.setSuccessor(handler2);handler2.setSuccessor(handler3);// 请求int[] request = {15, 67, 8, 9, 46, 1, 5, 23, 41};// 循环给最小矗立着提交请求,不同的数额,得不同的权限处理者处理for (int i : request) {handler1.handleRequest(i);}}
}
优点
- 降低耦合度:请求的发送者和接收者解耦,客户端无需指定具体的处理者。
- 增强灵活性:可以动态地添加或删除处理者,改变链的结构,增强系统的可扩展性。
- 责任分担:每个处理者只需关注自己能处理的请求部分,职责清晰明确。
- 代码简洁:避免了大量的条件判断语句,使代码更加简洁、清晰。
缺点
- 性能问题:如果链过长,可能会导致请求的处理效率下降。
- 调试困难:由于请求在多个处理者之间传递,调试和追踪请求处理过程可能较为复杂。
- 可能无处理者:如果没有处理者能够处理请求,可能需要额外的机制来处理这种情况。
场景
- 有多个对象可以处理同一请求,具体处理者在运行时刻确定。
- 需要在不明确指定接收者的情况下向多个对象中的一个提交请求。
- 可动态地指定一组处理对象来处理请求。
总结
职责链模式通过将请求的处理者组织成链式结构,实现了请求发送者与接收者的解耦,增强了系统的灵活性和可扩展性。它适用于多个对象有机会处理同一请求的场景,能够有效地降低系统的复杂度。
这篇关于【设计模式-职责链】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!