面向协议编程应用

面向协议编程应用

需求:对某些类的共性抽取,定义成协议(如百度地图和高德地图都有定位功能,如一些第三方厂商提供的相同功能的不同品牌模块,都可以把共性抽离做成协议,封装第三方厂商提供的lib文件并实现该协议)

抽象各个类的共性定义为协议

如类Object1Object2Object3都有print的功能,那把print定义成协议

@protocol CommonProtocol <NSObject>
@required
-(void)print;
@end 

分别实现具有共性的这些类

分别实现Object1``Object2``Object3并让其遵守CommonProtocol 实现其print方法

引入第三方库Objection,将对象和协议绑定

Objection一些解释

定义ObjectModule类,继承至JSObjectionModule

   @implementation ObjectModule
+(void)load{
    JSObjectionInjector *injector = [JSObjection defaultInjector];
    injector = injector ? : [JSObjection createInjector];
    injector = [injector withModule:[[self alloc] init]];
    [JSObjection setDefaultInjector:injector];
}
-(void)configure{
    Class <CommonProtocol>Obj1 = NSClassFromString(@"Object1");
    if (Obj1) {
        [self bind:Obj1 toProtocol:@protocol(CommonProtocol) named:@"Object1"];
    }
    Class <CommonProtocol>Obj2 = NSClassFromString(@"Object2");
    if (Obj2) {
        [self bind:Obj2 toProtocol:@protocol(CommonProtocol) named:@"Object2"];
    }
    Class <CommonProtocol>Obj3 = NSClassFromString(@"Object3");
    if (Obj3) {
        [self bind:Obj3 toProtocol:@protocol(CommonProtocol) named:@"Object3"];
    }
}
@end

使用Objectx(1,2,3)

在需要使用的文件中引入CommonProtocol.h协议

id Object = [[JSObjection defaultInjector] getObject:@protocol(CommonProtocol) named:@"Object3"];
id <CommonProtocol>instance = [[Object alloc] init];
NSLog(@"%@",[instance print]);

总结

用依赖注入的方法可以只在使用的地方引入协议的头文件,结合JSObjection获得之前绑定在协议上的类。如果将实现做成第三方库(将协议和Module做成库,将几个Object1、2、3分别做成库)用Pod来引入工程,可以根据工程需要具体引入那些对象(Object1、2、3),这样可以实现按需引入第三方库,减小包的大小。