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;
}
执行结果
文章图片
image.png 【iOS责任链模式及应用】参考
推荐阅读
- 2020-04-07vue中Axios的封装和API接口的管理
- 画解算法(1.|画解算法:1. 两数之和)
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- 「#1-颜龙武」区块链的价值是什么()
- iOS中的Block
- leetcode|leetcode 92. 反转链表 II
- 记录iOS生成分享图片的一些问题,根据UIView生成固定尺寸的分享图片
- BNC公链|BNC公链 | Eth2.0测试网Topaz已质押超100万枚ETH
- 【#2-戴栋】区块链可以提升哪些商业上的效率改进
- 2019-08-29|2019-08-29 iOS13适配那点事