iOS责任链模式及应用

责任链模式
顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
介绍

意图:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。
何时使用:在处理消息的时候以过滤很多道。
如何解决:拦截的类都实现统一接口。

工作中用途:

最近有个需求需要插件化调用组件
链式调用

    self.addPlugin(@"CameraProPluginPOI")
    .addPlugin(@"CameraProPluginSave")
    .addPlugin(@"CameraProPluginDoSome")
    .addPlugin(@"CameraProPluginDoSome1");

给管理类添加响应链数组

- (CameraProPluginManager *(^)(NSString *plugin))addPlugin
{
    return ^(NSString *plugin){
        if(!plugin || plugin.length>0){
            [self.chain addObject:plugin];
        }
        return self;
    };
}

通过反射生成响应链对象node列表,每个node对象中有一个strong指针指向下一个处理对象,返回第一个node的指针

/// 响应链
- (CameraProBasePlugin *)getPlugins{
    if(!self.chain || self.chain.count<1)return  nil;
    CameraProBasePlugin *firstChain = nil;
    NSMutableArray *chainList = [NSMutableArray new];
    for(NSString *plugin in self.chain){
        CameraProBasePlugin *pluginPoint = [self getPlugin:plugin];
        [chainList addObject:pluginPoint];
        if(chainList.count>1){
            NSInteger index = [chainList indexOfObject:pluginPoint];
            CameraProBasePlugin *subplugin = [chainList objectAtIndex:index-1];
            subplugin.next = pluginPoint;
        }
    }
    firstChain = chainList[0];
    [chainList removeAllObjects];
    return firstChain;
}

通过判断next指针是否有值,判断是否调用下一个node的处理函数

- (CameraProBaseData *)runPlugin:(CameraProBaseData *)data
{
    self.info = data;
    self.info.point++;
    NSLog(@"----------------point:%ld----------------",(long)self.info.point);
    if(self.next != nil){
        [self.next runPlugin:self.info];
    }
    NSLog(@"----------------%s----------------",__func__);
    return self.info;
}

执行结果


iOS责任链模式及应用_第1张图片
image.png

参考

你可能感兴趣的:(iOS责任链模式及应用)