在objective-c中實現(xiàn)模板方法模式(template method)

首先是一個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];

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容