设计模式--责任链模式

使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链路传递,直到有对象处理请求为止。

责任链模式UML

责任链模式-定义

Handler抽象处理者 该角色对请求进行抽象,并定义一个方法来设定和返回对下一个处理者的引用。

1
2
3
4
5
6
7
8
9
10
11
12
13
public abstract class Handler{
private Handler nextHandler;

public abstract void handleRequest();

public Handler getNextHandler(){
return this.nextHandler;
}

public void seNextHandler(Handler _handler){
this.nextHandler= _nextHandler;
}
}

抽象处理者实现两个职责:

  • 定义一个请求的处理方法handleRequest()
  • 定义一个责任链的编排方法setNextHandler(),设置下一个处理者

ConcreteHandler:*具体处理器者 该角色接到请求后,可以选择将请求处理掉,或者将请求传给下一个处理者。由于具体矗立着持有对下一个处理者的引用,因此,如果需要,处理者可以访问下一个访问者

1
2
3
4
5
6
7
8
9
10
11
12
13
public class ConcreteHandler extends Handler{
@Override
public void handleRequest(){
System.out.println(this.toString()+"处理器已处理");
if(getNextHandler()!=null){
//转移到下一个处理器处理
getNextHandler().handleRequest();
}else{
//如果没有下一个则本身处理请求
...
}
}
}

具体处理者负责处理请求handleRequest()如果存在下一节点可以向下传递。

1
2
3
4
5
6
7
8
public class Client {
public static void main(String[] args){
Handler h1 = new ConcreteHandler();
Handler h2 = new ConcreteHandler();
h1.setNextHandler(h2);
h1.handleRequest();
}
}

责任链模式-优点

  • 责任链模式将请求和处理分开。请求者可以不用知道是谁处理的,处理者可以不用知道请求的全貌。提高系统灵活性。

责任链模式-缺点

  • 性能降低。每个请求都是从链头遍历到链尾,特别是在链比较长的时候。
  • 不易于调试。链条比较长,环节比较多的时候,由于采用了类似递归的方式,调试时会比较复杂。

责任链模式-使用注意事项

链中节点数量需要控制,避免超长链的情况。

一般做法是在Handler(抽象处理者)中设置一个最大节点数量,在setNextHandler()中判断是否已经超过最大值,超过则拒绝建立链,避免过量节点。

责任链模式-应用场景

  • 一个请求需要一系列的处理工作。
  • 业务流的处理,例如文件审批。
  • 对系统进行拓展扩充。

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!