设计模式的理解的总结
參考的博客:http://blog.csdn.net/wangeen/article/details/8272501
最近又把設(shè)計模式翻了一邊,寫個個人總結(jié),這個總結(jié)比較簡單,主要是一些理解,對于他們的實現(xiàn)和應(yīng)用以后再總結(jié)
設(shè)計模式是編程抽象化的一個具體的應(yīng)用,它讓程序更好的閱讀和理解,邏輯上更加合理,是通向更大規(guī)模軟件的一個基礎(chǔ),換個說法,如果一個軟件的模式很混亂那么它混亂到一定的程度就再也編寫和維護(hù)不下去了,一直覺得Java?c#的設(shè)計模式體現(xiàn)得更好,這是因為和他們的一切都是對象的理念比較一致,c++的稍微少一些,但是同樣重要。
設(shè)計模式在大體上分3種
1. 如何構(gòu)造對象而采用的模式(creational pattern)
2. 對象本身如何進(jìn)行組織優(yōu)化的模式(structure pattern)
3. 對象之間的行為如何管理的模式(behavioral pattern)
creational pattern主要有如下幾個幫助構(gòu)造對象的pattern,
? ? 1. abstract factory, ?一個抽象工廠類可以派生出很多具體的工廠類;一個抽象產(chǎn)品類可以派生出很多具體的產(chǎn)品類;
其核心就是創(chuàng)建很多的product對象,然后在用一個factory對象里面構(gòu)造很多createProduct的方法,使用起來也很簡單,就是調(diào)用這一系列的create function,隱藏了對具體的對象的new, 另外factory通常都是singleton, 這個模式還有一個順帶的好處就是可以很方便的切換不同的product family, 這個模式使用可以提高程序的觀感和可讀性,一個文件的list對所有的對象的創(chuàng)建都包含了。
? ? 2. builder, 把復(fù)雜對象的構(gòu)造和表示分離,所謂的構(gòu)造就是builder中的一系列的method,這個pattern在anuvad中用得很好, 這個模式其實和abstract factory很類似,區(qū)別就是這里把一個復(fù)雜的對象分成好多step來構(gòu)造,而abstract factory是一系列的小對象,也就是這里的step相當(dāng)于那里product family中的一個。
? ? 3. factory method, 一個工廠類根據(jù)傳入的參數(shù)創(chuàng)建對應(yīng)的產(chǎn)品類;
就是提供一些method來創(chuàng)建具體的對象,常用的比如創(chuàng)建一個default的對象,或者根據(jù)一個id來決定來用哪個method。?
? ? 4. prototype,通過copy一些具體的對象實例來構(gòu)造新對象,是一種相對實例化的結(jié)構(gòu),注意每個product都要實現(xiàn)copy function,這個模式的理解還不透徹。
? ? 5. singleton:全局代碼之間只有一個實例,需要做好保護(hù)。
structure pattern主要有如下幾種優(yōu)化組織結(jié)構(gòu)的方法。
? ? 1. ?adaptor,就是用多重繼承的方式讓一個已有的對象能支持別的對象的接口。
? ? 2. bridge, 就是將一個對象拆成兩個,一個是abstraction(比較穩(wěn)定的部分接口面對客戶),另一個是implementation, QT當(dāng)中有很多這樣的pattern
? ? 3. composite, 就是一個對象,包含了一個對本身的list,這樣就構(gòu)成了一個tree, 然后對要用的函數(shù)對這個list進(jìn)行實現(xiàn),對于單個和整體的處理可以用統(tǒng)一的接口,此pattern和chain of reponsibility關(guān)聯(lián)很緊。
? ? 4. decorator, 對已有對象構(gòu)造一個decorator,然后繼承這個對象擴(kuò)展一些功能, B= decorator(A),那么B具有了A和擴(kuò)展的一些功能。
? ? 5. facade, 對應(yīng)用庫提供了一些更高層次的接口的抽象,提供更簡單的接口,這個模式的理解還不透徹。
? ? 6. flyweight, 對大量的重復(fù)使用的對象緩存,建立一個map, 當(dāng)要使用的時候先查看有沒有有就不要創(chuàng)建了,http://supercrsky.iteye.com/blog/372714
? ? 7. proxy, 對一個已有的class再次封裝,控制對這個對象的訪問,和decorator很類似,但是一個是擴(kuò)展功能,一個是限制,實現(xiàn)很類似但是更多的是架構(gòu)上的不一致
behavioral pattern, 描述了對象之間的行為,其封裝的核心即行為本身也可以是對象
? ? ?1. chain of responsibility 所有的class 都繼承同一個動作,每一個class都對同一個動作作出響應(yīng),比如打印log, 一個接一個,用起來很方便
? ? ?2. command, 把action作為一個對象,里面有一個要處理的對象的指針,可以用來紀(jì)錄操作和(re)do
? ? ?3. interpreter, 打造自己的語言解釋器,每一個語法作為一個對象
? ? ?4. iterator, stl里面有實現(xiàn),用起來真的很方便
? ? ?5. mediator, 構(gòu)造一個class,可以將子class的變動相互通知,比如GUI中的組合控件
? ? ?6. memento, 本質(zhì)就是一個保存瞬時狀態(tài)的structure, 可以進(jìn)行還原, 和command一起使用來實現(xiàn)redo功能
? ? ?7. observer, MVC架構(gòu)實現(xiàn)的核心pattern, 和mediator很相似,只是這個一對多,另一個是任意組合。
? ? ?8. state, 傳說中的狀態(tài)機, 最常見的例子是TCP的狀態(tài)的轉(zhuǎn)換,用戶只要面對一個簡單的接口,每個狀態(tài)是一個class, 所有的狀態(tài)的轉(zhuǎn)換都在各個class內(nèi)自動完成。
? ? ?9. strategy, 把算法分裝成對象,A=new B(算法 N)
? ? ?10. template method, 把算法切割很幾步,把其中幾步退化(defer)到子class中去做
? ? ?11. ?vistor,構(gòu)造一個vistor對象, 每個對象在vistor中都有一個對應(yīng)的函數(shù), vistor和對象相互耦合,不改變原來對象就可以訪問它
? ? ? ? ? ?E::accept(V&v){v.vE(this)};?
boost中有一些設(shè)計模式的模板,比如abstract factory, 按照他們的說法就是abstract factory有很多冗余的代碼,用template會很簡單,另外還有flyweight, 設(shè)計得比較好作為一種allocate和其他的stl容器配合使用非常方便,也很節(jié)省內(nèi)存,另外model c++里面用template的policy和traits來實現(xiàn)了很多的設(shè)計模式,這有個好處就是一次設(shè)計永遠(yuǎn)有用。
總結(jié)
以上是生活随笔為你收集整理的设计模式的理解的总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言方框透视原理,FPS游戏的方框透视
- 下一篇: node.js入门教程(B站黑马程序员)