大話設(shè)計模式這本書最后有一個“OOTV”杯模式大賽衍慎,很有意思,我單獨把它拿出來作為一篇手記网严,順便加上一些結(jié)合實際項目使用設(shè)計模式的所思所感。
首先嗤无,在這一章中理清了設(shè)計模式的三類:創(chuàng)建型設(shè)計模式震束,結(jié)構(gòu)型設(shè)計模式和行為型設(shè)計模式。先列在下面:
創(chuàng)建型設(shè)計模式:
單例模式当犯,工廠方法模式垢村,抽象工廠模式,建造者模式嚎卫,原型模式
結(jié)構(gòu)型設(shè)計模式:
適配器模式嘉栓,裝飾模式,橋接模式拓诸,組合模式侵佃,享元模式,代理模式奠支,外觀模式
行為型設(shè)計模式:
觀察者模式馋辈,模版方法模式,命令模式胚宦,狀態(tài)模式首有,職責(zé)鏈模式燕垃,解釋器模式枢劝,中介者模式井联,訪問者模式,策略模式您旁,備忘錄模式烙常,迭代器模式
其實理清了設(shè)計模式的分類對我們使用設(shè)計模式是很有幫助的,比如在創(chuàng)建對象的時候可以參考哪些模式鹤盒,在組織類之間關(guān)系要想到什么模式蚕脏,遇到“壞味道”的時候要往什么方向去想。
然后又對每種設(shè)計模式進行了梳理侦锯,不同設(shè)計模式進行了比對加深了對每個模式的認識驼鞭。下面主要是我對設(shè)計模式的一些想法。
1)何時想用設(shè)計模式
這個題目有點不大合適尺碰,因為什么時候我們的腦海中都要有設(shè)計模式挣棕,我的意思是什么時候想到用什么樣的設(shè)計模式。其實我覺得設(shè)計模式還可以有一種分類方式亲桥,就是設(shè)計時設(shè)計模式和重構(gòu)時設(shè)計模式洛心。有些設(shè)計模式是我們在設(shè)計項目的時候就要考慮的,比如工廠方法模式题篷,單例模式词身,享元模式等。還有大部分模式都是我們在最初設(shè)計時可能考慮不到的番枚,比如我們最開始只有單一算法法严,想不到用策略模式結(jié)構(gòu)。再如最初只有少量狀態(tài)葫笼,或者少量子類深啤,用ifelse和簡單工廠完全可以駕馭,就不會先考慮工廠方法和狀態(tài)模式渔欢。其實這也是完全可以的墓塌,所以我想說的有兩點:第一最好在一開始設(shè)想好可能擴展的地方進行設(shè)計;第二可以先有當前最優(yōu)解奥额,當變化第一次出現(xiàn)的時候一定要及時修正苫幢,不然會對之后的擴展產(chǎn)生很不好的影響。
2)善于發(fā)現(xiàn)壞味道
我發(fā)現(xiàn)很多書垫挨,或者是課程都會把程序里面的不好的設(shè)計比喻成“壞味道”想想還挺萌的韩肝。壞味道一定是設(shè)計結(jié)構(gòu)有問題,絕大部分可以通過設(shè)計模式來解決九榔。我們舉幾個例子:代碼冗余哀峻,累里面有大量的代碼這是很常見的事情涡相,那么這個時候很有可能違背了單一職責(zé)原則,要多職責(zé)進行重新分配剩蟀。很多的ifelse或者switch結(jié)構(gòu)催蝗,如果實在工廠中可以考慮用工廠方法,在其他類中可以考慮是不是可以用狀態(tài)模式育特,職責(zé)鏈模式替換掉丙号。重復(fù)代碼,造成這種代碼的原因肯定是因為懶缰冤,如果是整個程序共用的一些代碼比如說類型轉(zhuǎn)換犬缨,可以單獨提出來,如果出現(xiàn)在某一個繼承樹中棉浸,就要考慮放到抽象方法中實現(xiàn)怀薛。
3)擴展時的痛點
其實我覺得程序員還是很樂意修改“壞味道”的,但是大部分程序員會忽略結(jié)構(gòu)上的設(shè)計問題迷郑。雖然我們最初設(shè)計的時候是本著開閉原則的枝恋,但是要加新功能的時候還是避免不良想直接對原來的類進行修改甚至增添職責(zé),久而久之維護就變得越來越難三热。如果要加新的功能有幾種方式鼓择,首先如果這個功能可以單獨提出一個類作為類的方法,那是很好的就漾,可以用聚合代替繼承呐能。或者裝飾器模式就是專門為一組子類擴展功能提供支持的一種設(shè)計模式抑堡。如果子類固定的話可以使用訪問者模式來擴展方法摆出。所以設(shè)計模式給我們的解決方案其實很多,發(fā)現(xiàn)老代碼不易改馬上反思首妖,改新代碼的時候第一反應(yīng)應(yīng)該是擴展偎漫。
4)不拘泥于設(shè)計模式結(jié)構(gòu)
設(shè)計模式是一種思想,而不是固定的類圖有缆,這是我一直以來的理解象踊。比如有的時候我們實現(xiàn)的是接口而不是繼承,這樣就不可以用大部分設(shè)計模式了嗎棚壁,答案當然是否定的杯矩。當然這里還要說一點,就是有的時候當你覺得你用的方式和設(shè)計模式的適用范圍不同的時候袖外,第一反應(yīng)還是思考一下適不適合使用這種設(shè)計模式史隆。設(shè)計模式本身也不是沒有變形,比如裝飾模式可以是繼承并聚合父類曼验,也可以直接繼承一個類實現(xiàn)泌射。話又說回來粘姜,在完全理解設(shè)計模式思想之前還是先套模版比較穩(wěn)健,雖然最終目標是活用其思想熔酷。
結(jié)語:設(shè)計模式絕對是從設(shè)計到實現(xiàn)到重構(gòu)整個流程的程序員的利器孤紧,敢于科學(xué)的重構(gòu)自己代碼,敢于科學(xué)的使用設(shè)計模式纯陨,對自己對項目都是大有益處的坛芽。也希望就設(shè)計模式的問題與他人進行交流留储。