美文网首页
17-责任链模式

17-责任链模式

作者: 二斤寂寞 | 来源:发表于2020-04-29 16:58 被阅读0次

    责任链模式-Chain of Responsibility Pattern【学习难度:★★★☆☆,使用频率:★★☆☆☆】

    请求的链式处理——职责链模式(一):采购单的分级审批
    请求的链式处理——职责链模式(二):职责链模式概述
    请求的链式处理——职责链模式(三):采购单分级审批的职责链模式解决方案
    请求的链式处理——职责链模式(四):纯与不纯的职责链模式,职责链模式总结

    顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。

    在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

    介绍

    • 意图:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

    • 主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。

    • 何时使用:在处理消息的时候以过滤很多道。

    • 如何解决:拦截的类都实现统一接口。

    • 关键代码:Handler 里面聚合它自己,在 HanleRequest 里判断是否合适,如果没达到条件则向下传递,向谁传递之前 set 进去。

    • 应用实例: 1、红楼梦中的"击鼓传花"。 2、JS 中的事件冒泡。 3、JAVA WEB 中 Apache Tomcat 对 Encoding 的处理,Struts2 的拦截器,jsp servlet 的 Filter。

    • 优点:
      1、降低耦合度。它将请求的发送者和接收者解耦。
      2、简化了对象。使得对象不需要知道链的结构。
      3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
      4、增加新的请求处理类很方便。

    • 缺点:
      1、不能保证请求一定被接收。
      2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
      3、可能不容易观察运行时的特征,有碍于除错。

    使用场景: 1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。 2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。 3、可动态指定一组对象处理请求。

    注意事项:在 JAVA WEB 中遇到很多应用。


    Demo地址

    #import <Foundation/Foundation.h>
    
    @class BusinessObject;
    
    /// block 是否有返回?
    /// 本人2中思考,(案例1:订单金额问题,金额太大,组长找经理,经理找董事长,层层查找,可以返回)由子类直接终止,减少查询next时间
    /// 案例2,去掉返回值,直接由next作决定。终止的话,不设定next即可。
    typedef void(^CompletionBlock)(BOOL handled);
    
    typedef void(^ResultBlock)(BusinessObject *handler, BOOL handled);
    
    @interface BusinessObject : NSObject
    
    // 下一个响应者(响应链构成的关键)
    @property (nonatomic, strong) BusinessObject *nextBusiness;
    // 响应者的处理方法
    - (void)handle:(ResultBlock)result;
    
    // 各个业务在该方法当中做实际业务处理
    - (void)handleBusiness:(CompletionBlock)completion;
    @end
    
    #import "BusinessObject.h"
    
    @implementation BusinessObject
    
    // 责任链入口方法
    - (void)handle:(ResultBlock)result
    {
        CompletionBlock completion = ^(BOOL handled){
            // 当前业务处理掉了,上抛结果
            if (handled) {
                result(self, handled);
            }
            else{
                // 沿着责任链,指派给下一个业务处理
                if (self.nextBusiness) {
                    [self.nextBusiness handle:result];
                }
                else{
                    // 没有业务处理, 上抛
                    result(nil, NO);
                }
            }
        };
        
        // 当前业务进行处理
        [self handleBusiness:completion];
    }
    
    - (void)handleBusiness:(CompletionBlock)completion
    {
        /*
         子类去重写此方法,实现各自业务逻辑ABC...
         执行block,返回(YES/NO)
         */
    }
    
    @end
    
    

    示例:

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
    
        BusinessObject1 *obj1 = [[BusinessObject1 alloc] init];
        BusinessObject2 *obj2 = [[BusinessObject2 alloc] init];
        BusinessObject3 *obj3 = [[BusinessObject3 alloc] init];
        
        // 添加前后依赖关系,后续进行更改
        obj1.nextBusiness = obj2;
        obj2.nextBusiness = obj3;
        
        [obj1 handle:^(BusinessObject *handler, BOOL handled) {
            
        }];
    }
    
    image.png

    相关文章

      网友评论

          本文标题:17-责任链模式

          本文链接:https://www.haomeiwen.com/subject/cmkywhtx.html