接口化编程(iOS)


接口化编程, 很多人都知道, 具体它的好处非常明显, 个人理解主要是解耦合, 能把代码模块化出来, 要知道, 代码和代码之间的耦合越高, 到后期自然是越难维护的。多的不说, 直接拿例子说, 就能提现它的好处:

背景:比如公司有两个app, 但是代码很多都是类似的, 所以我们把一些公有的代码都抽离出来叫TWBaseLibrary, 那你会问, 碰到那种依赖的怎么办, 对啊!接口化解决啊~~~~

场景: 获取后台数据并初始化的代码是公用的, 主页的内容配置都是根据后台返回的数据来定的, 但是支持的样式有所不同, 所以这里初始化是需要动态配置的, 因为两个app的配置内容肯定不同, so:

@implementation TWMultipleAdapterMgr

+ (void)initAdapters:(UITableView *)tableView Sections:(NSArray<TWModuleBaseModel> *)sectionList
{
    if (sectionList && sectionList.count > 0) {
        id<ITWAdapterService> adapter_service = [ServiceLocator getService:TWService_Adapters];
        if (adapter_service && [adapter_service respondsToSelector:@selector(getAdapterMap)]) {
            NSDictionary *adapters = [adapter_service getAdapterMap];
            for (int i=0; i<sectionList.count; i++) {
                TWModuleBaseModel *model = [sectionList objectAtIndex:i];
                
                NSString *value = [adapters objectForKey:@(model.moduleId)];
                if (value) {
                    TWSectionTableViewAdapter *adapter = [[[NSClassFromString(value) class] alloc] initWithTableView:tableView];
                    if (adapter) {
                        [TWSectionTableViewAdapterMgr addAdapter:tableView withAdapter:adapter];
                    }
                }
            }
        }
    }
}

@end

TWMultipleAdapterMgr

2.上面这段代码就是在初始化时, TWMultipleAdaterMgr是写在TWBaseLibrary中的, 可以看到

id<ITWAdapterService> adapter_service = [ServiceLocator getService:TWService_Adapters]; 这行代码的作用就是来拿到具体的实现类, 你肯定会问ServiceLocator是什么, ITWAdapterService又是什么, 接着看:

3.ServiceLocator就是作为管理所有实现类的一个容器, 简单点, 就是个数组类, TWService_Adapters就是对应的key, 用key取出实现类, 我这里的实现类是TWAdapterService, 所以你在程序初始化的时候, 就需要把key(TWService_Adapters)对应的实现类(TWAdapterService)装到ServiceLocator管理的数组中, 这样我在TWMultipleAdaterMgr中用的时候自然可以通过key取到我要用的实现, 说到这里我相信大家都知道ITWAdapterService就是这个接口了, TWAdapterService这个类就是实现了ITWAdapterService这个接口, 那我吗看看怎么写的:

/* adapter接口 */
NSString * const TWService_Adapters=@"TWService_Adapters";
@protocol ITWAdapterService <NSObject>
@required

- (NSDictionary *)getAdapterMap;

@end


4.接口很简单, 就是申明了一个getAdapterMap方法, 返回一个dictionary(map), 那看下实现:

@interface TWAdapterService : NSObject<ITWAdapterService>

@end
@implementation TWAdapterService

/* 返回adapters */
- (NSDictionary *)getAdapterMap
{
    return @{
             @(1):@"TWSelectionPostSectionAdapter",
             @(2):@"TWBannerWithTitleSectionAdapter",
             @(3):@"TWRecommendStudioSectionAdapter",
             @(4):@"TWSearchEnterStoreAdapter",
             };
}

@end

5. 头文件申明实现ITWAdapterService接口, 实现返回了一个dictionary, 不同数字对应了不同的adapter(可以理解成样式)

6.这样的话, TWBaseLibrary中的代码 我两个app都导入一份, 但是实现类我可以写成 app1的话叫TWAdapterService1, app2的话叫TWAdapterService2, 这个就随便你定了, 包括返回的内容, 也是随意定了, app1可以支持1,2,3,4四种样式, app2可以支持1,2,3,4,5,6,7,8八种样式, 这样就很灵活了.  

7.最明显的好处是, TWBaseLibrary中的代码可以自编译通过, 而且不依赖app, 只有app单向依赖TWBaseLibrary, 再写一个项目, 再也不用只是单纯的copy修改了, 只要pod install一下就okay了~ 是不是方便了很多....

8. 这只是一部分, 当然还有很多需要实现的地方,  当然TWBaseLibrary代码量越来越大之后, 你又可以考虑再将TWBaseLibrary拆解成n个小模块, 这样你的管理也变得简单了.


有问题留言...






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值