模板方法和策略模式區(qū)別【GeekBand】

在做這周設(shè)計(jì)模式的作業(yè)時(shí)對(duì)實(shí)現(xiàn)“FileSplitter支持多種文件分割算法”應(yīng)該模板方法模式還是策略模式糾結(jié)一下婶芭,通過對(duì)查閱相關(guān)資料得到了解答叽讳,遂記錄于此快压。
作業(yè)題目[1]:

考慮一個(gè)文件分割器的設(shè)計(jì)糙俗。MainForm為界面類绷杜,收集用戶輸入的文件路徑和分割數(shù)量直秆。FileSpliter為實(shí)現(xiàn)文件分割的類型,其中Split()實(shí)現(xiàn)文件分割算法鞭盟。1.要求為Split()支持多種文件分割算法(至少三種)圾结,在MainForm中靈活切換多種算法。2.在Split()分割過程中齿诉,實(shí)現(xiàn)對(duì)進(jìn)度條的實(shí)時(shí)通知筝野,即對(duì)ProgressBar賦值晌姚。3.使用松耦合面向?qū)ο笤O(shè)計(jì)方法和思想,無需編寫具體算法實(shí)現(xiàn)歇竟,可使用偽碼表示設(shè)計(jì)挥唠。

在實(shí)現(xiàn)Split的過程,發(fā)現(xiàn)模板方法和策略模式都可以滿足題目的要求焕议。模板方法以FileSplitter為基類宝磨,在Split實(shí)現(xiàn)文件分割的大流程和對(duì)進(jìn)度條的實(shí)時(shí)通知,將真正實(shí)現(xiàn)切割的代碼doSplit聲明為保護(hù)方法号坡,讓子類覆蓋懊烤。子類通過覆蓋父類的doSplit來實(shí)現(xiàn)算法定制。為達(dá)到在MainForm自由切換算法的目的宽堆,可以使用簡(jiǎn)單工廠模式來自由生產(chǎn)FileSplitter實(shí)例腌紧。類結(jié)構(gòu)圖如下:


圖1模板方法結(jié)構(gòu)圖

同樣該問題也可以使用策略模式來解決。策略模式首先聲明一個(gè)ISplitStragy接口畜隶,該方法包含了一個(gè)實(shí)現(xiàn)算法分割的接口doSplit壁肋。各個(gè)文件分割策略都實(shí)現(xiàn)ISplitStragy接口,然后FileSplitter包含一個(gè)ISplitStragy對(duì)象并在Split()函數(shù)中調(diào)用該策略籽慢。同樣浸遗,為了實(shí)現(xiàn)在MainForm中自由的切換算法,可以使用簡(jiǎn)單工廠模式來自由生產(chǎn)FileSplitter實(shí)例箱亿。類結(jié)構(gòu)圖如下:


圖2策略模式結(jié)構(gòu)圖

通過上述的講解跛锌,我們發(fā)現(xiàn)該題完全可以通過模板方法/策略模式來實(shí)現(xiàn),而且也看不出誰優(yōu)誰劣届惋。那么這兩種方法是否等同了嗎髓帽?顯然不是。
首先脑豹,我們來看下這兩種模式的意圖郑藏。
策略模式[2]

定義一系列的算法,把它們一個(gè)個(gè)封裝起來, 使它們可相互替換。本模式使得算法可獨(dú)
立于使用它的客戶而變化瘩欺。

模板方法[2]

定義一個(gè)操作中的算法的骨架必盖,而將一些步驟延遲到子類中。TemplateMethod使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟俱饿。

從意圖上來看歌粥,兩者都在試圖解決算法多樣性對(duì)代碼結(jié)構(gòu)的沖擊。只是拍埠,策略模式通過將算法封裝成類失驶,通過組合使用這些類。而模式方法則將算法的可變部分封裝成Hook械拍,由子類定制突勇。
從定義上來看装盯,模式方法更加側(cè)重于業(yè)務(wù)流程相對(duì)復(fù)雜且穩(wěn)定,而其中的某些步驟(局部變化)變化相對(duì)劇烈的場(chǎng)景甲馋。而策略模式則是偏重于算法本身(整個(gè)算法)就變化相對(duì)距離的情形埂奈。因此,當(dāng)使用場(chǎng)景中業(yè)務(wù)流程相對(duì)簡(jiǎn)單且穩(wěn)定的情況定躏,使用策略模式和模板方法都是可以得账磺,但是更推薦用模板方法(模板方法更靈活)。
綜上:模板方法和策略模式都是解決算法多樣性對(duì)代碼結(jié)構(gòu)沖擊的問題痊远。模板方法使用與業(yè)務(wù)場(chǎng)景相對(duì)復(fù)雜且穩(wěn)定的情況垮抗,策略模式使用與算法相對(duì)多樣靈活的場(chǎng)景。當(dāng)業(yè)務(wù)相對(duì)簡(jiǎn)單時(shí)碧聪,策略模式和模板方法幾乎等效冒版,但是推薦使用策略模式。
參考資料:
[1]設(shè)計(jì)模式第一周作業(yè) http://mooc.study.163.com/learn/GeekBand-1000113005?tid=2001225007#/learn/hw?id=2001449004
[2]設(shè)計(jì)模式 GoF

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末逞姿,一起剝皮案震驚了整個(gè)濱河市辞嗡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌滞造,老刑警劉巖续室,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異谒养,居然都是意外死亡挺狰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門买窟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丰泊,“玉大人,你說我怎么就攤上這事蔑祟〕煤模” “怎么了沉唠?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵疆虚,是天一觀的道長。 經(jīng)常有香客問我满葛,道長径簿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任嘀韧,我火速辦了婚禮篇亭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锄贷。我一直安慰自己译蒂,他們只是感情好曼月,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著柔昼,像睡著了一般哑芹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捕透,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天聪姿,我揣著相機(jī)與錄音,去河邊找鬼乙嘀。 笑死末购,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的虎谢。 我是一名探鬼主播盟榴,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼婴噩!你這毒婦竟也來了曹货?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤讳推,失蹤者是張志新(化名)和其女友劉穎顶籽,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體银觅,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡礼饱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了究驴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镊绪。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖洒忧,靈堂內(nèi)的尸體忽然破棺而出蝴韭,到底是詐尸還是另有隱情,我是刑警寧澤熙侍,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布榄鉴,位于F島的核電站,受9級(jí)特大地震影響蛉抓,放射性物質(zhì)發(fā)生泄漏庆尘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一巷送、第九天 我趴在偏房一處隱蔽的房頂上張望驶忌。 院中可真熱鬧,春花似錦笑跛、人聲如沸付魔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽几苍。三九已至杨刨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間擦剑,已是汗流浹背妖胀。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惠勒,地道東北人赚抡。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像纠屋,于是被迫代替她去往敵國和親涂臣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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

  • 1 場(chǎng)景問題# 1.1 報(bào)價(jià)管理## 向客戶報(bào)價(jià)售担,對(duì)于銷售部門的人來講赁遗,這是一個(gè)非常重大、非常復(fù)雜的問題族铆,對(duì)不同的...
    七寸知架構(gòu)閱讀 5,079評(píng)論 9 62
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法岩四,類相關(guān)的語法,內(nèi)部類的語法哥攘,繼承相關(guān)的語法剖煌,異常的語法,線程的語...
    子非魚_t_閱讀 31,630評(píng)論 18 399
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,108評(píng)論 25 707
  • 大學(xué)時(shí)打過一個(gè)辯題,正方是性格改變命運(yùn)栅葡,反方是命運(yùn)改變性格茉兰。 極度燒腦的特訓(xùn)期,是訓(xùn)練我們辯手們正方也能講欣簇,反方也...
    凱瑞理想生活代言人閱讀 203評(píng)論 0 0
  • 音樂 音樂是什么规脸,是靈魂伴侶?是情感的調(diào)和擠醉蚁?也有人說:音樂是輕拂人疲憊身軀的一縷清涼微...
    竊貲閱讀 272評(píng)論 0 0