什么是适配器模式?
例: 我们现在有很多不同种的螺母, 但只有一个螺钉, 螺钉都需要经过处理之后才可以用在螺母上, 处理螺钉的工具就叫做适配器。
日常开发中,经常遇到多个视图上需要呈现来自一处的数据, 每个视图的数据处理,就可以定义适配器, 对数据进行处理, 每个适配器对数据处理, 返回给对应的视图, 当然使用一个类来包含所有适配器是可以的, 但是如果过多的处理堆在一个类中, 不方便日后阅读, 所以我建议, 每个适配器都建一个类.
// 声明 Adaptor
@property (nonatomic, strong) id<AdaptorProtocol> adaptor;
// 获取数据
#pragma mark - APIManagerDelegate
- (void)apiManagerDidSuccess:(APIManager *)manager {
NSDictionary *datas = [manager fetchDataWithAdaptor:self.adaptor]; // 通知数据源, 提供数据给 Adaptor 并让 Adaptor 执行数据处理, 返回数据.
NSLog(@"%@", datas);
}
// 初始化
- (id<AdaptorProtocol>)adaptor {
if (!_adaptor) {
_adaptor = [[Adaptor alloc] init];
}
return _adaptor;
}
在 数据源 统一处理执行 Adaptor 的方法, 数据源不管你需要什么数据, 只把自己持有的数据给 Adaptor, 让 Adaptor 处理数据.
// APIManager.m
- (NSDictionary *)fetchDataWithAdaptor:(id<AdaptorProtocol>)adaptor {
if (adaptor == nil) {
return nil;
} else {
return [adaptor configDataWithManager:self]; // 执行数据处理
}
}
// Adaptor.h
#import "APIManager.h"
extern NSString * const kAdaptorKeyGender;
extern NSString * const kAdaptorKeyName;
@interface Adaptor : NSObject<AdaptorProtocol>
@end
// Adaptor.m
#import "Adaptor.h"
NSString * const kAdaptorKeyGender = @"kAdaptorKeyGender";
NSString * const kAdaptorKeyName = @"kAdaptorKeyName";
@implementation Adaptor
- (NSDictionary *)configDataWithManager:(APIManager *)manager {
// 处理数据, 并返回数据
return @{kAdaptorKeyName:manager.dic[@"name"], kAdaptorKeyGender:manager.dic[@"gender"]};
}
@end
如果需要一种新的数据格式, 就可以增加一个新的 Adaptor, 来做相应的处理即可.
使用适配模式, 主要是为了把数据处理从 view 中抽出来, 方便日后的测试和修改.
网友评论