侧边栏壁纸
  • 累计撰写 8 篇文章
  • 累计创建 7 个标签
  • 累计收到 1 条评论

设计模式---责任链模式

Aiden
2021-12-21 / 0 评论 / 0 点赞 / 5,235 阅读 / 1,032 字
温馨提示:
本文最后更新于 2022-01-27,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

职责链模式( 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 结构图

image-20210608195804486

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类,直接返回链中的第一个处理者,具体链的设置不需要高层次模块关系,这样,更简化了高层次模块的调用,减少模块间的耦合,提高系统的灵活性。

0

评论区