带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(5)https://developer.aliyun.com/article/1338235?groupCode=taobaotech
代理模式
在开发过程中,我们会在越来越多的地方使用到上图能力,比如「淘宝拍照」的相册中、「扫一扫」的相册中,用到解码、码展示、码处理的能力。
因此,我们需要把这些能力封装并做成插件化,以便在任何地方都能够使用。这里就引出了我们改造的第三步:代理模式。
代理模式是一种结构型设计模式,能够提供对象的替代品或其占位符。代理控制着对于原对象的访问, 并允许在将请求提交给对象前后进行一些处理。
本文设计的状态模式,包含两部分:
- 代理单例 GlobalProxy
- 代理的管理 ProxyHandler
两者结构如图所示
代理单例 GlobalProxy
单例的目的主要是减少代理重复初始化,可以在合适的时机初始化以及清空保存的内容。单例模式对于 iOSer 再熟悉不过了,这里不再赘述。
代理的管理 Handler
维护一个对象,提供了对代理增删改查的能力,实现对代理的操作。这里实现 Key - Value 的 Key 为 Protocol ,Value 为具体的代理。
代码示例如下
+ (void)registerProxy:(id)proxy withProtocol:(Protocol *)protocol { if (![proxy conformsToProtocol:protocol]) { NSLog(@"#TBGlobalProxy, error"); return; } if (proxy) { [[TBGlobalProxy sharedInstance].proxyDict setObject:proxy forKey:NSStringFromProtocol(proto- col)]; } } + (id)proxyForProtocol:(Protocol *)protocol { if (!protocol) { return nil; } id proxy = [[TBGlobalProxy sharedInstance].proxyDict objectForKey:NSStringFromProtocol(proto- col)]; return proxy; } + (NSDictionary *)proxyConfigs { return [TBGlobalProxy sharedInstance].proxyDict; } + (void)removeAll { [TBGlobalProxy sharedInstance].proxyDict = [[NSMutableDictionary alloc] init]; }
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(7)https://developer.aliyun.com/article/1338216?groupCode=taobaotech