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)returnnil; 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责任链模式及应用
文章图片
image.png 【iOS责任链模式及应用】参考

    推荐阅读