原文:详解Java设计模式之职责链模式_java_脚本之家
责任链模式是一种行为设计模式,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,文中通过代码示例给大家介绍的非常详细,需要的朋友可以参考下
−
目录
- 职责链模式
- 1、职责链模式介绍
- 1.1 职责链模式基本实现
- 2、具体例子说明
- 2.1 不使用职责链模式 - 加薪 / 请假
- 2.2 职责链模式 - 加薪 / 请假
- 3、职责链模式总结
- 1、职责链模式介绍
职责链模式
1、职责链模式介绍
责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
在责任链模式中,请求通过一条链传递,每个对象都有机会处理请求。当一个对象无法处理请求时,它会将请求传递给链中的下一个对象,直到找到能够处理请求的对象为止。这种方式可以动态地组织和管理对象,使得请求发送者和接收者之间解耦,提高系统的灵活性和可扩展性。
1.1 职责链模式基本实现
职责链模式结构图:
责任链模式包含以下几个角色:
- 抽象处理者(Handler):定义了一个处理请求的接口,通常包含一个指向下一个处理者的引用,用于构建责任链。
- 具体处理者(ConcreteHandler):实现抽象处理者接口,具体处理请求的逻辑。如果可以处理请求,则处理请求;否则,将请求传递给下一个处理者。
Handler类,定义一个处理请示的接口:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
ConcreteHandler类,具体处理者类,处理它所负责的请求,可访问它的 后继者,如果可处理该请求,就处理之,否则就将该请求转发给它的后继 者。
ConcreteHandler1,当请求数为0~10则有权处理,否则转到下一位:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
ConcreteHandler2,当请求数为10~20则有权处理,否则转到下一位。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
ConcreteHandler3,当请求数为20~99则有权处理,否则转到下一位
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
客户端代码,向链上的具体处理者对象提交请求。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
2、具体例子说明
2.1 不使用职责链模式 - 加薪 / 请假
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 |
|
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 |
|
客户端:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
2.2 职责链模式 - 加薪 / 请假
将上面的程序进行重构,得到的代码结构图如下:
Request请求类:
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 |
|
抽象管理者:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
经理类就可以去继承这个'管理者'类,只需重写 '申请请求' 的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
总监同样继承抽象管理类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
总经理同样继承管理者类,总经理的权限就是全部都需要处理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
测试类:
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 |
|
最后得到的结果:
3、职责链模式总结
职责链模式的好处
- 当客户提交一个请求时,请求是沿链传递直至有一个 ConcreteHandler 对象负责处理它。
- 降低耦合:接收者和发送者都没有对方的明确信息,且链中的对 象自己也并不知道链的结构。结果是职责链可简化对象的相互连接,它们仅 需保持一个指向其后继者的引用,而不需保持它所有的候选接受者的引用。降低了代码之间耦合度。
- 灵活性:随时地增加或修改处理一个请求的结构。增强了给对象指派职责的灵活性。
优点:
- 将请求发送者和接收者解耦,可以避免请求发送者与接收者之间的直接耦合,增强了代码的可维护性。
- 可以动态地新增或修改请求处理顺序,提高了程序的灵活性和可扩展性。
- 可以进行请求的拦截、分流等操作,方便进行统计和日志记录等处理。
- 可以根据需要对请求的处理进行单独的测试,便于代码测试和调试。
- 解耦发送者和接收者:职责链模式可以将发送者和接收者解耦,发送者不需要知道请求的具体处理者是谁,而处理者也不需要知道请求的发送者是谁,从而提高系统的灵活性。
- 动态组合和扩展性:职责链模式允许动态地向链中添加或删除处理者,以适应不同的业务需求,增强了系统的可扩展性。
- 可配置性:通过调整链中处理者的顺序,可以灵活地配置处理流程,满足不同的处理优先级或条件。
缺点:
- 请求的保证:没有明确的处理者处理请求的保证。请求可能到达链的末尾而没有被处理,这需要在设计时进行合理的考虑。
- 性能考虑:由于链中的请求需要依次传递给每个处理者,因此在处理大量请求时可能会影响性能。
- 可能导致系统变得复杂:当链过长或者处理者过多时,职责链模式可能会导致系统变得复杂,难以理解和维护。
使用场景:
- 处理复杂的请求处理流程,例如购物车结算、审批流程等复杂业务中。
- 需要动态指定请求的处理顺序或者动态添加新的请求处理者时。
- 处理日志记录、缓存等拦截器的场景。例如在Spring中,就应用了责任链模式来实现Interceptor拦截器。
- 多个对象可以处理同一请求,但具体的处理者在运行时可变或不确定的情况下,可以使用职责链模式。
- 需要动态组合处理流程或动态调整处理顺序的情况下,职责链模式可以提供灵活性和可配置性。
- 需要在不明确请求的发送者和接收者之间建立松耦合关系的情况下,职责链模式可以解耦对象之间的关系。
以上就是详解Java设计模式之职责链模式的详细内容,更多关于Java 职责链模式的资料请关注脚本之家其它相关文章!
您可能感兴趣的文章:
- 深入了解Java设计模式之职责链模式
- Java设计模式之职责链模式详解
- 深入理解Java设计模式之职责链模式
- Java职责链模式的深入了解
- Java设计模式中单一职责原则详解
- Java创建型设计模式之建造者模式详解