介紹和實現:
- 策略模式的結構其實非常簡單,比模板方法模式簡單多了,它實質上就是一個原則的體現,往低里說就是里式替換原則,往高里說是依賴倒置原則,具體實現過程是這樣:
- 有一個接口A中有一個抽象算法方法a
- 有一組接口A的實現類A-? 用不同具體算法實現了抽象算法方法a
- 在客戶端里先持有一個算法接口的引用,在要調用某個算法方法時,你就給這個引用賦實現類的值,然后通過這個引用調用相應算法方法就可以了
- 而模板方法模式
- 有一個抽象類A中有兩個方法(暫時忽略鈎子方法),抽象算法方法a-abstruct,模板業務方法a-mode(模板方法中使用到了抽象算法方法,所以其實這個模板方法現在還不能正常工作)
- 在客戶端里要使用這個類時,繼承抽象類,並實現抽象算法方法,然后實例化使用
共同點:
- 目的是一樣的,讓不同算法實現的業務復用代碼
區別:
- 形式看起來就是【策略模式】把【模板方法模式】中的模板方法獨立到另一個類中,然后在使用的時候,再跟實現了的算法子類拼接到一起。(使用的時候拼接,用戶能知道自己在使用什么模式)
- 【模板方法模式】在使用的時候,不用拼接,因為在繼承的時候已經是分開繼承的,兩個方法本來就在一起,你要用哪組就直接調用哪組就行了。(用的時候直接調用完整方法,用戶不知道是什么模式實現的)
一個混淆:
- 有時候策略模式中,實現類A-?中用不同具體算法實現的抽象算法方法a中可能有很多重復代碼,這個時候為了復用,就把這些重復代碼剝離出去,用的時候再調用,那剝離到哪兒呢,就剝離到接口A中,那這個時候接口A就必須是抽象類A了,在這個時候你會發現,策略模式的抽象類A中也有兩個方法,也是一個抽象算法方法和另一個具體方法,看着是不是有點像模板方法模式,但其實完全不同:
- 這里的具體方法並不是模板方法,而是另一個工具方法
- 另外還是有一個業務類B和業務方法b,這個b才是意義上的模板方法
- 表面上看策略模式復雜,其實不然,策略模式就是最最簡單的面向接口編程的一個例子,最最簡單的多態的一個體現,從這個角度看,其實是非常簡單的
優缺點或者說兩個方法的適應場景:
- 看了很多,發現很多偏頗或者說一團漿糊的理解,即使是已經工作的程序員,所以我特地辯駁一下
- 大部分人傾向於兩者差不多,懶得吐槽了
- 還有人甚至對兩種模式的界定都分不清,用不要拘泥於模式來搪塞,然后最后說創新了一種介於兩者之間的模式,其實就是這兩種中的一種,比較多的其實是使用了抽象類代替接口的策略模式
- 然后還有人認為兩者最大的區別是外界對方法修改的訪問權限的區別,這個不能說沒有,但是這個點幾無價值
- 個人體會
- 模板方法適合小項目,因為它的形式最簡單,用起來方便,但是它對算法的復用比較不靈活,而且大量的繼承會產生大量冗余代碼,也加重了系統負擔
- 策略模式適合大項目,它形式雖然復雜一些,但是管理規范,對算法的復用也可以非常靈活(尤其是在使用抽象類代替接口時),甚至可以用多重算法嵌套來進一步減少冗余代碼,而且由采用類的組合,冗余代碼也能減少很多