模版模式

模板方法模式的核心思想就是通過(guò)把不變的行為搬移到超類榆纽,去除子類中的重復(fù)代碼來(lái)體現(xiàn)它的優(yōu)勢(shì)夺英。其實(shí)皿伺,模板方法模式就是提供了一個(gè)很好的代碼復(fù)用平臺(tái)缭召。

首先栈顷,還是先簡(jiǎn)單看一下定義:

模板方法模式,定義一個(gè)操作中的算法的骨架嵌巷,而將一些步驟延遲到子類中萄凤。模板方法使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。

下面和給大家展示一下類的結(jié)構(gòu)圖:

其實(shí)搪哪,結(jié)構(gòu)很簡(jiǎn)單蛙卤,只有兩層關(guān)系,核心思想就是把公共方法向上提到父類中噩死。代碼實(shí)現(xiàn)起來(lái)也不復(fù)雜。下面還是老樣子神年,向大家簡(jiǎn)單展示一下代碼如何實(shí)現(xiàn)已维。

首先是一個(gè)protocol,相當(dāng)于java里的interface:

復(fù)制代碼代碼如下:

// 初始化腳本協(xié)議

@protocol YLSInitialScript

- (void) doInit:(YLSClientInfo*) clientInfo;

@end

然后定義一個(gè)抽象類已日,實(shí)現(xiàn)這個(gè)接口的總體框架性算法垛耳,但是具體的實(shí)現(xiàn)聲明為抽象方法:

復(fù)制代碼代碼如下:

@interface YLSInitialScriptTemplate : NSObject

-(id) initOrigin:(YLSInitialOperator *)operator;

// 抽象方法,由子類實(shí)現(xiàn)

- (void) createEverythingForFirstTime;

- (void) update;

- (NSString*) stepMsg;

@end

復(fù)制代碼代碼如下:

@implementation YLSInitialScriptTemplate

YLSInitialOperator *origin;

-(id) initOrigin:(YLSInitialOperator *)operator

{

origin = operator;

return self;

}

- (void) doInit:(YLSClientInfo*) clientInfo

{

if ([clientInfo shouldInit]) {

[self createEverythingForFirstTime];// 無(wú)表飘千,初始化

} else if ([clientInfo shouldUpdate]) {

[self update];// 升級(jí)

}

[origin notifyStepDone:[self stepMsg]];// 通知Bootstrap View Controller刷新進(jìn)度條

}

// 以下3個(gè)是抽象方法堂鲜,延遲到子類實(shí)現(xiàn)

- (void) createEverythingForFirstTime

{

[self doesNotRecognizeSelector:_cmd];

}

- (void) update

{

[self doesNotRecognizeSelector:_cmd];

}

- (NSString*) stepMsg

{

[self doesNotRecognizeSelector:_cmd];

return nil;

}

@end

最后是具體的子類,不需要重新實(shí)現(xiàn)協(xié)議里規(guī)定的doInit()方法护奈,只要實(shí)現(xiàn)抽象類里的3個(gè)抽象方法就可以了:

復(fù)制代碼代碼如下:

@interface YLSServiceDataInitScript : YLSInitialScriptTemplate

@end

復(fù)制代碼代碼如下:

@implementation YLSServiceDataInitScript

- (void) createEverythingForFirstTime

{

// 具體邏輯

}

- (void) update

{

}

- (NSString*) stepMsg

{

// 具體邏輯

}

@end

語(yǔ)法沒(méi)有java里這么清楚缔莲,關(guān)鍵就是在抽象類里用

復(fù)制代碼代碼如下:

[self doesNotRecognizeSelector:_cmd];

這行代碼實(shí)現(xiàn)類似java中abstract關(guān)鍵字的效果

最后是實(shí)現(xiàn)調(diào)用的客戶端代碼:

復(fù)制代碼代碼如下:

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)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市霉旗,隨后出現(xiàn)的幾起案子痴奏,更是在濱河造成了極大的恐慌蛀骇,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件读拆,死亡現(xiàn)場(chǎng)離奇詭異擅憔,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)檐晕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門暑诸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人辟灰,你說(shuō)我怎么就攤上這事个榕。” “怎么了伞矩?”我有些...
    開(kāi)封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵笛洛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我乃坤,道長(zhǎng)苛让,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任湿诊,我火速辦了婚禮狱杰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘厅须。我一直安慰自己仿畸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布朗和。 她就那樣靜靜地躺著错沽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪眶拉。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天忆植,我揣著相機(jī)與錄音,去河邊找鬼耀里。 笑死,一個(gè)胖子當(dāng)著我的面吹牛拾氓,可吹牛的內(nèi)容都是我干的冯挎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼织堂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼叠艳!你這毒婦竟也來(lái)了易阳?” 一聲冷哼從身側(cè)響起附较,我...
    開(kāi)封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎潦俺,沒(méi)想到半個(gè)月后拒课,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡早像,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年肖爵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片劝堪。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖熬粗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情余境,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布含末,位于F島的核電站即舌,受9級(jí)特大地震影響答渔,放射性物質(zhì)發(fā)生泄漏侥涵。R本人自食惡果不足惜宋雏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望磨总。 院中可真熱鬧,春花似錦娶牌、人聲如沸奔浅。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鉴裹。三九已至舞骆,卻和暖如春径荔,著一層夾襖步出監(jiān)牢的瞬間督禽,已是汗流浹背总处。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胧谈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓第岖,卻偏偏與公主長(zhǎng)得像试溯,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子遇绞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,709評(píng)論 0 9
  • 模板模式 編寫優(yōu)秀代碼的一個(gè)要素是避免冗余蹄咖。在面向?qū)ο缶幊讨懈堵梗椒ê秃瘮?shù)是我們用來(lái)避免編寫冗余代碼的重要工具《尕遥回想...
    英武閱讀 1,328評(píng)論 0 50
  • 本文大部分內(nèi)容翻譯至《Pro Design Pattern In Swift》By Adam Freeman,一...
    ZhouMac閱讀 408評(píng)論 0 0
  • 重要概念 概念: 定義一個(gè)算法的基本骨架徽诲,只是微小部分不得實(shí)現(xiàn)推遲到子類實(shí)現(xiàn),用的是繼承的特性谎替,但思想是不一樣的,...
    張霸天閱讀 256評(píng)論 0 0
  • 同讀一本書——《談話的力量》 原文:肯迪的建議也適用于社交場(chǎng)合挫掏。通常情況下,最好是以簡(jiǎn)單的問(wèn)題開(kāi)始砍濒,談?wù)撘恍?duì)方感...
    w小郭閱讀 120評(píng)論 0 0