yType {
if (![self containsPrepayDataStrategyWithPayType:payType]) {
return nil;
}
NSString *payTypeKey = [Utils convertPayTypeToString:payType]; //将枚举转成字符串
Class cls = self.strategyMap[payTypeKey];
return [[cls alloc] init]; //在需要时才返回创建的对象
}
//懒加载,需要时创建
- (NSMutableDictionary *)strategyMap {
if (!_strategyMap) {
_strategyMap = @{}.mutableCopy;
}
return _strategyMap;
}
@end
通过上面的支付配置(单例)对象,我们将以支付类型为key
, 以对应的获取预支付信息的类为value
, 使用字典来管理。 将配置类设计成单例
,这样就可以在支付组件中访问,并使用其中的配置信息。
支付组件的伪代码:
#import "PayConfig.h"
@interface PayManager :NSObject
//调用预支付信息API接口,用到的请求参数
@property (nonatomic,strong) NSDictionary *requestParams;
//支付第三方类型
@property (nonatomic,assign) PayType payType;
//开始支付
- (void)startPay;
@end
@implementation PayManager
//开始支付
- (void)startPay {
//1. 根据支付类型,判断支付配置中是否有需要请求服务API的处理类
if ([[PayConfig config] containsPrepayDataStrategyWithPayType:self.payType]) {
id strategy = [[PayConfig config] getPrepayDataStrategyWithPayType:self.payType];
//利用KVC向请求API接口的策略类传递请求参数
[strategy setValue:self.requestParams forKey:@“requestParams”];
//准备好请求数据后,开始调用接口API获取所需要的预支付信息
[strategy getPayData:^(id result, NSError *error ) {
//拿到需要的预支付信息后,再调起第三方支付组件
}];
}else {
// 调起第三方支付组件
}
}
@end
总结
通过我们的进一步设计,支付组件已完全不依赖于网络组件来完成对预支付信息的获取,而且扩展性更强了。 如果以后有新的支付第三方加入进来,且需要获取预支付信息的, 我们只需要实现PayDataPrepareProtocol
协议, 并将其加入到 PayConfig
中就可以了。 通过少量的修改我们就可以完成扩展,也遵循了“开闭原则( 对扩展开放,对修改关闭)” 。
完整的支付组件代码请前往:RZPayManager
在README.md文件中有该组件的使用详解,如果喜欢,点关注支持一下。
后记
如果本文对你有一点帮助的话,欢迎收藏、点赞,感谢。文中如有不对之处,也欢迎大家在评论区指出,共勉。