职责链模式( Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
定义:Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.(使多个对象都有机会处理请求,从而避兔了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。)
问题:
- 处理业务如何传递(链的构造)
- 如何定义出口
Chain of Responsibility 结构图
abstract class Handler{
protected Handler successor;
public void setSuccessor(Handler successor){
this.successor = successor
}
public abstract void HandleRequest(int request);
}
class ConcreteHandler1 extends Handler{
@override
public void HandleRequest(int request){
// if 满足处理条件
// do handle
// else
if(this.successor != null){
successor.HandleRequest(request);
}else{
// 没有找到合适的处理类,责任链出口
}
}
private void doHandle(){
// do ...
}
}
责任链的好处:
- 降低耦合度,请求和处理分开,请求者不需要知道具体是谁处理的
- 增强了给独享指派责任的灵活性
责任链的缺点:
- 性能低,每次处理都要从头遍历到尾
- 调试不方便
关键点:
1. 在构造函数中或setter函数中指定继任者
2. 如果一个Handler没有继任者,则为责任链的出口
3. 责任链的长度不能太长,否则性能太低
在实际应用中,一般会有一个封装类对责任模式进行封装,也就是替代 Client类,直接返回链中的第一个处理者,具体链的设置不需要高层次模块关系,这样,更简化了高层次模块的调用,减少模块间的耦合,提高系统的灵活性。
评论区