面向协议编程应用
需求:对某些类的共性抽取,定义成协议(如百度地图和高德地图都有定位功能,如一些第三方厂商提供的相同功能的不同品牌模块,都可以把共性抽离做成协议,封装第三方厂商提供的lib文件并实现该协议)
抽象各个类的共性定义为协议
如类Object1
和Object2
和Object3
都有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),这样可以实现按需引入第三方库,减小包的大小。