带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(1)https://developer.aliyun.com/article/1338307?groupCode=taobaotech
设计模式
责任链模式
上述技术链路流程中,码处理流程对应的就是原有的 viewController 里面的巨无霸逻辑。通过梳理我们看到,码处理其实是一条链式的处理,且有前后依赖关系。优化方案有两个,方案一是拆解成多个方法顺序调用;方案二是参考苹果的 NSOperation 独立计算单元的思路,拆解成多个码处理单元。方案一本质还是没解决开闭原则(对扩展开放,对修改封闭)问的题。方案二是一个比较好的实践方式。那么怎么设计一个简单的结构来实现此逻辑呢?
码处理链路的特点是,链式处理,可控制处理的顺序,每个码处理单元都是单一职责,因此这里引出改造第一步: 责任链模式。
责任链模式是一种行为设计模式, 它将请求沿着处理者链进行发送。收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。
本文设计的责任链模式,包含三部分:
- 创建数据的 Creator
- 管理处理单元的 Manager
- 处理单元 Pipeline
三者结构如图所示
创建数据的 Creator 包含的功能和特点:
- 因为数据是基于业务的,所以它只被声明为一个 Protocol ,由上层实现。
- Creator 对数据做对象化,对象生成后 self.generateDataBlock(obj, Id) 即开始执行
API 代码示例如下
1 /// 数据产生协议 <CreatorProtocol> 2 @protocol TBPipelineDataCreatorDelegate <NSObject> 3 @property (nonatomic, copy) void(^generateDataBlock)(id data, NSInteger dataId); 4 @end
上层业务代码示例如下
@implementation TBDataCreator @synthesize generateDataBlock; - (void)receiveEventWithScanResult:(TBScanResult *)scanResult eventDelegate:(id <TBScanPipelineEventDeletate>)delegate { //对数据做对象化 TBCodeData *data = [TBCodeData new]; data.scanResult = scanResult; data.delegate = delegate; NSInteger dataId = 100; //开始执行递归self.generateDataBlock(data, dataId); } @end
管理处理单元的 Manager 包含的功能和特点:
- 管理创建数据的 Creator
- 管理处理单元的 Pipeline
1 @interface TBPipelineManager : NSObject 2 /// 添加创建数据 Creator 3 - (TBPipelineManager *(^)(id<TBPipelineDataCreatorDelegate> dataCreator))addDataCreator; 4 /// 添加处理单元 Pipeline 5 - (TBPipelineManager *(^)(id<TBPipelineDelegate> pipeline))addPipeline; 6 /// 抛出经过一系列 Pipeline 的数据。当 Creator 开始调用 generateDataBlock 后,Pipeline 就开始执行 7 @property (nonatomic, strong) void(^throwDataBlock)(id data); 8 @end
采用支持链式的点语法,方便书写API
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(3)https://developer.aliyun.com/article/1338256?groupCode=taobaotech