在做這周設(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)圖如下:
同樣該問題也可以使用策略模式來解決。策略模式首先聲明一個(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)圖如下:
通過上述的講解跛锌,我們發(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