首先是一個protocol,相當(dāng)于java里的interface:
// 初始化腳本協(xié)議
@protocol YLSInitialScript
- (void) doInit:(YLSClientInfo*) clientInfo;
@end
然后定義一個抽象類,實現(xiàn)這個接口的總體框架性算法,但是具體的實現(xiàn)聲明為抽象方法:@interface YLSInitialScriptTemplate : NSObject
-(id) initOrigin:(YLSInitialOperator *)operator;
// 抽象方法,由子類實現(xiàn)
- (void) createEverythingForFirstTime;
- (void) update;
- (NSString*) stepMsg;
@end
@implementation YLSInitialScriptTemplate
YLSInitialOperator *origin;
-(id) initOrigin:(YLSInitialOperator *)operator
{
origin = operator;
return self;
}
- (void) doInit:(YLSClientInfo*) clientInfo
{
if ([clientInfo shouldInit]) {
[self createEverythingForFirstTime];// 無表,初始化
} else if ([clientInfo shouldUpdate]) {
[self update];// 升級
}
[origin notifyStepDone:[self stepMsg]];// 通知Bootstrap View Controller刷新進度條
}
// 以下3個是抽象方法,延遲到子類實現(xiàn)
- (void) createEverythingForFirstTime
{
[self doesNotRecognizeSelector:_cmd];
}
- (void) update
{
[self doesNotRecognizeSelector:_cmd];
}
- (NSString*) stepMsg
{
[self doesNotRecognizeSelector:_cmd];
return nil;
}
@end
最后是具體的子類,不需要重新實現(xiàn)協(xié)議里規(guī)定的doInit()方法,只要實現(xiàn)抽象類里的3個抽象方法就可以了:
@interface YLSServiceDataInitScript : YLSInitialScriptTemplate
@end
@implementation YLSServiceDataInitScript
- (void) createEverythingForFirstTime
{
// 具體邏輯
}
- (void) update
{
}
- (NSString*) stepMsg
{
// 具體邏輯
}
@end
語法沒有java里這么清楚,關(guān)鍵就是在抽象類里用
[self doesNotRecognizeSelector:_cmd];
這行代碼實現(xiàn)類似java中abstract關(guān)鍵字的效果
最后是實現(xiàn)調(diào)用的客戶端代碼:
scripts = [NSMutableArray new];
// 需要執(zhí)行的腳本依次添加在下面
[scripts addObject:[[YLSShowDataInitScript new] initOrigin:self]];
[scripts addObject:[[YLSServiceDataInitScript new] initOrigin:self]];
[scripts addObject:[[YLSMemberDataInitScript new] initOrigin:self]];
[scripts addObject:[[YLSBillDataInitScript new] initOrigin:self]];
[scripts addObject:[[YLSEmployeeDataInitScript new] initOrigin:self]];
[scripts addObject:[[YLSBackupDataInitScript new] initOrigin:self]];
for (int i = 0; i < [scripts count]; i++) {
[[scripts objectAtIndex: i] doInit:clientInfo];
}