17-责任链模式

2020-04-29  本文已影响0人  二斤寂寞

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

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

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

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

介绍

使用场景: 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
上一篇下一篇

猜你喜欢

热点阅读