场景简介
某开发部门出过一次严重的开发事故;新来的技术负责人小孙为此从产品->研发->测试->运维制定了一个流程,每个环节都需要相应的人员去检验负责,经过一段时间的磨合以后,产品的开发流程更加规范快捷,也鲜有事故发生了。
责任链模式:使多个对象都有机会处理请求,从⽽避免了请求的发送者和接受者之间的耦合关系。将这些对象连成⼀条链,并沿着这条链传递该请求,直到有对象处理它为⽌。
类图介绍
抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。
代码示例
abstract class Handler {
private Handler next;
public Handler getNext() {
return next;
}
public void setNext(Handler next) {
this.next = next;
}
public abstract void handle();
}
class HandlerA extends Handler {
@Override
public void handle() {
//判断是否处理以及如何处理
System.out.println("handle a");
if (getNext() != null) {
getNext().handle();
}
}
}
class HandlerB extends Handler {
@Override
public void handle() {
//判断是否处理以及如何处理
System.out.println("handle b");
if (getNext() != null) {
getNext().handle();
}
}
}
public class HandlerDemo {
public static void main(String[] args) {
Handler handler = new HandlerA();
handler.setNext(new HandlerB());
}
}
责任链模式优缺点
优点
-
将请求与处理解耦
-
请求处理者(节点对象)只需关注自己感兴趣的请求进行处理即可,对于不感兴趣的请求,直接转发给下一个节点。
-
具备链式传递处理请求功能,请求发送者无需知晓链路结构,只需等待请求处理结果。
-
链路结构灵活,可以通过改变链路结构动态的新增或者删除责任。
-
易于拓展新的请求处理类,符合开闭原则
缺点
-
责任链太长或者处理时间太长,会影响整体性能
-
如果节点对象存在循环引用会造成死循环,导致系统崩溃
- 本文链接: https://www.sunce.wang/archives/she-ji-mo-shi-zhi-ge-xing-qi-ze-de-ze-ren-lian-mo-shi
- 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!