设计模式的理解:对23个设计模式的总结
生活随笔
收集整理的這篇文章主要介紹了
设计模式的理解:对23个设计模式的总结
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
設(shè)計模式名 ,鏈接可用
文檔可下載:https://download.csdn.net/download/superSmart_Dong/16625368
| 設(shè)計模式 | 意圖 | 適用的場景 | 關(guān)鍵實現(xiàn)過程 | 優(yōu)點 | 缺點 | 備注 | |
| 1 | 模板模式 | 通常定義出一個穩(wěn)定的骨架,特定的內(nèi)容的實現(xiàn)延遲至子類中去實現(xiàn) | 易變,容易根據(jù)實際需求改動的代碼塊,對此代碼塊進行延遲到子類中實現(xiàn) | 不變的算法在基類中保留,易變的算法變成虛函數(shù)由子類實現(xiàn) | 把不確定部分剝離開來,實現(xiàn)確定的部分。讓將來的調(diào)用者簡單實現(xiàn)不確定的方法就可以達(dá)到想要的效果 | 對調(diào)用者屏蔽了穩(wěn)定的代碼,使調(diào)用者雖了解使用方法但不易理解底層實現(xiàn)的邏輯 | 例如,線程:用戶不需要理解與硬件的關(guān)聯(lián)關(guān)系,只需要知道實現(xiàn)run方法就可以讓程序達(dá)到高效,并行的目的 |
| 2 | 策略模式 | 定義一系列算法,把他們用一個個類封裝起來,并使它們可以動態(tài)地相互替換. | 業(yè)務(wù)場景無法窮舉,卻要根據(jù)不同的場景做出不同的操作。 | 根據(jù)枚舉或者其他標(biāo)志創(chuàng)建具體的派生類。用基類接收派生類,調(diào)用基類的方法。 | 減少了if..else的判斷,把各個分支的實現(xiàn)變成了派生類方法的實現(xiàn)。避免代碼臃腫,減小了需求變動、擴展的影響性 | 采用動態(tài)綁定會比編譯時綁定性能低些,但是可以忽略 | 可以窮舉的if...else 可以不需要用策略模式 |
| 3 | 觀察者模式 | 當(dāng)下層結(jié)構(gòu)需要向上層結(jié)構(gòu)傳遞信號時,不應(yīng)該將上層的變量傳遞到下層的方式實現(xiàn)。因為下層結(jié)構(gòu)不應(yīng)該依賴于上層結(jié)構(gòu) | 上層結(jié)構(gòu)接收來自下層結(jié)構(gòu)的信號,而返回值類型又不確定時 | 定義一個對信號操作的接口,信號數(shù)組是下層結(jié)構(gòu)中的成員。上層結(jié)構(gòu)繼承該接口,并將自身添加進下層結(jié)構(gòu)的信號數(shù)組,從而接收下層結(jié)構(gòu)的傳遞的信號 | 下層結(jié)構(gòu)不直接依賴與上層結(jié)構(gòu) | ? | 例如進度條展示,下層架構(gòu)需要對 已下載數(shù)量占總大小的百分比傳遞到上層。但是進度條可以是條狀的也可以菊花狀的,接收信號的數(shù)據(jù)類型并不確定。所以下層將信號傳進接口中,上層結(jié)構(gòu)實現(xiàn)接口方法,操作 接口的輸入?yún)?shù)。 |
| 4 | 裝飾模式 | 動態(tài)的給對象擴展一些額外的職責(zé) | 給基類添加功能后還是屬于基類的范疇 | 定義一個功能裝飾類繼承基類,同時成員屬性又包含基類類型。具體功能類繼承裝飾類,實現(xiàn)基類的方法,在實現(xiàn)過程中先實現(xiàn)自身的邏輯,最后再調(diào)用基類的方法。而成員基類抽象對象的賦值通過構(gòu)造函數(shù)實現(xiàn)。 | 定義一個功能類,將原先的派生類傳遞到功能對象中,功能對象調(diào)用方法就可以達(dá)到目的。此模式可以隨意組合任意的方法,擺脫了繼承的濫用 | ? | 例如文件流,網(wǎng)絡(luò)流都繼承流這個對象,現(xiàn)新增一個加密功能來加密流的讀寫操作。那么這個加密功能封裝成類,繼承于流,并流又是加密類的成員。實現(xiàn)加密流的讀、寫方法后再調(diào)用流的抽象方法。 |
| 5 | 橋模式 | 當(dāng)基類從多個不同維度派生時,不同維度間的聯(lián)系應(yīng)該解耦 | 當(dāng)基類需要從多個不同維度派生時 | 將基類的功能按照維度去拆分出不同的基類,各個基類時另外基類的成員 | 將基類的功能按照維度拆分后,各個維度進行了解耦。 | ? | 例如,一個類中用登錄功能和發(fā)送消息,播放聲音和播放動畫功能。當(dāng)操作系統(tǒng)不一樣時播放聲音和播放動畫的功能不一樣,當(dāng)用戶VIP等級不一樣時登錄功能和發(fā)送消息效果不一樣。那么就需要將類按照者兩個維度進行拆分成兩個基類,這兩個基類相互是對方的成員。 |
| 6 | 工廠模式 | 利用抽象類去動態(tài)地創(chuàng)建對象 | 與策略模式配合 | ? | ? | ? | ? |
| 7 | 抽象工廠模式 | 利用抽象類動態(tài)地創(chuàng)建一系列的對象 | 需要動態(tài)地創(chuàng)建一組對象時,每一組中的對象之間有緊密的聯(lián)系 | 對類中的每個對象用工廠模式創(chuàng)建。將創(chuàng)建標(biāo)志用成員變量去存,之后就直接調(diào)用函數(shù)就行 | 用統(tǒng)一的創(chuàng)建標(biāo)志保證了一系列對象間的關(guān)聯(lián)性 | ? | 例如DBConnection對象和DBCommand對象,不能將SQLConnection和DBCommand創(chuàng)建起來。 |
| 8 | 原型方法 | 通過深拷貝克隆出一個新的對象。操作時用新對象去操作,不影響原先對象 | 怕指針傳遞和指針傳遞的間接改變未知代碼的實參 | 實現(xiàn)抽象類的clone方法,進行深拷貝 | ? | ? | 在C++中還需需要實現(xiàn)深拷貝的拷貝構(gòu)造函數(shù) |
| 9 | 構(gòu)造器模式 | 將一個復(fù)雜對象的構(gòu)建與其表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示 | 成員參數(shù)之間有一定的關(guān)聯(lián)性,會根據(jù)情況不同初始化不同部分的成員參數(shù)。并不是所有參數(shù)都必須初始化時。 | 創(chuàng)建內(nèi)部類Builder,所有成員拷貝到Builder中,把必須初始化的參數(shù)設(shè)成Builder的構(gòu)造函數(shù),可選初始化的用鏈?zhǔn)絪et進行初始化。最后調(diào)用build方法,build方法把自身傳遞近原對象的構(gòu)造函數(shù)中 | 把復(fù)雜的對象初始化變得簡單。 | ? | ? |
| 10 | 單例模式 | ①一個類只能初始化出一個對象?②保證對象是線程安全的。 | 要求只能被創(chuàng)建一次對象的類 | 所有成員和成員方法設(shè)成靜態(tài),靜態(tài)成員有自身的引用,私有的構(gòu)造函數(shù)和拷貝構(gòu)造函數(shù),靜態(tài)初始化函數(shù)需要保證線程安全。可以用返回局部靜態(tài)對象的方式來保證線程安全,但是在C++11不支持 | 保證了結(jié)構(gòu)的規(guī)范化 | 線程安全是一個難題 | ? |
| 11 | 享元模式 | 使用大量細(xì)粒度對象時,代價過高性能變低的問題 | 粒度大的對象的創(chuàng)建,并且該對象的值經(jīng)常使用的情況 | 對粒度大的對象或者對象屬性用引用的形式封裝起來,用緩存的形式讓對象或者對象屬性減少創(chuàng)建次數(shù) | 減小創(chuàng)建對象的開銷 | 如果對象屬性每次都不一樣,對應(yīng)的key值每次都不一樣一樣也會創(chuàng)建不少對象 | ? |
| 12 | 門面(外觀)模式 | 避免外部程序直接調(diào)用內(nèi)部方法,對內(nèi)部方法進行有效的屏蔽。 | 對外開放的內(nèi)部方法多。并且容易根據(jù)需求而改變 | 用一個提供些專門進行對外訪問的接口,比如三層架構(gòu)的BLL層 | ? | ? | ? |
| 13 | 代理模式 | 可以新增些特有的操作,而不用去修改原有對象邏輯 | 特例多 | 代理對象繼承于基類且成員有基類的引用,代理類可以實現(xiàn)基類的方法也可以使用基類的方法還可以新增特有的方法。 | 隔絕了外界用戶對實際對象的訪問 | ? | 例如:銀行卡、存折等不方便讓外界用戶訪問,但是外界用戶想存取錢,可以訪問支票對象。由支票對象間接的操作 |
| 14 | 適配器模式 | 為了轉(zhuǎn)變接口方式的一種模式。即通過一個中介,作為兩個不兼容接口之間的橋梁(老接口與新接口),使原先的老對象不僅可以使用自身的老接口,而且還可以通過適配器類,用新接口對老對象進行操作。 | 接口不一致 | 適配器類實現(xiàn)新接口,成員有原始類的引用。 | ? | ? | 例如電燈工作的輸入是電,如果用人想要讓電燈工作的輸入是聲音.那么定義輸入聲音的接口,適配器實現(xiàn)該接口,輸入是聲音,然后把聲音轉(zhuǎn)成電,最后再調(diào)用電燈的方法 |
| 15 | 中介者模式 | 降低多個對象和類之間的通信復(fù)雜性 | 類之間相互引用 | 實體抽象類引用中介抽象接口,實體中介引用所有實體類。實體類中調(diào)用中介方法,并傳入特有的標(biāo)識,實體中介類根據(jù)傳進來特有的標(biāo)識進行不同的處理,可以用策略模式進行搭配 | 減少了原先實體類之間的耦合性 | 實體中介類容易變得臃腫 | ? |
| 16 | 狀態(tài)模式 | 允許對象在內(nèi)部狀態(tài)發(fā)生改變時改變它的行為,對象看起來好像修改了它的類 | 調(diào)用自身方法來改變自身的狀態(tài),又會根據(jù)不同的狀態(tài)來調(diào)用不同的方法。避免if...else顯得臃腫 | 對原先的Context中每個狀態(tài)創(chuàng)建一個狀態(tài)類,狀態(tài)接口類需要實現(xiàn)和Context相同的方法。狀態(tài)類中的每個方法返回值都是下一個狀態(tài)。Context成員有下一個狀態(tài)和狀態(tài)接口的引用。Context方法中就是根據(jù)下一個狀態(tài)來初始化狀態(tài)對象,調(diào)用狀態(tài)對象中的方法并且再獲得下一個狀態(tài)。 | 避免Context類臃腫,狀態(tài)類可以與單例模式進行配合 | ? | ? |
| 17 | 備忘錄模式 | 存儲原先對象的屬性,又稱之為快照。方便之后回退。即游戲進度的存檔和讀檔 | 需要有回退功能的類 | 可以用內(nèi)部類的形式表現(xiàn),成員是原實體中重要的屬性,可以和原型模式搭配 | ? | ? | 現(xiàn)如今,儲存/讀取對象有更方便的方式。備忘錄模式在如今有些過時。更有效的方式可以替代備忘錄模式,例如對象序列化,對象編碼等。 |
| 18 | 組合(整體)模式 | 是用于把一組相似的對象當(dāng)作一個單一的對象進行統(tǒng)一的處理 | 對不同對象類型的批量處理操作 | 建立一個容器類,成員是實體的抽象數(shù)組。并且自身也繼承于抽象類,對于容器來說操作要對抽象數(shù)組進行遍歷遞歸調(diào)用方法,對于非容器來說,專心實現(xiàn)自己的方法就行。 | ? | ? | 容器相當(dāng)于根節(jié)點,非容器相當(dāng)于葉子節(jié)點。RadioButton,Button,GroupBox的關(guān)系一樣,當(dāng)GroupBox進行disable時,GroupBox包含的RadioButton,Button,GroupBox也一樣要disable |
| 19 | 迭代器模式 | 提供一種方法順序訪問一個集合對象中的各個元素,而又不需要暴露該對象的內(nèi)部表示。 | 遍歷容器又不向暴露內(nèi)部 | 迭代器類成員包含實體的引用,可用構(gòu)造函數(shù)初始化。迭代器中實現(xiàn)最基本的first,next,isdone,currentItem方法,實體類中g(shù)etIterator(){ return MyIterator(*this);} | ? | ? | STL庫中等其他類庫有現(xiàn)成的 |
| 20 | 職責(zé)鏈模式 | 為請求創(chuàng)建了一個接收者對象的鏈 | 有連續(xù)傳遞請求的需求 | 通常每個接收者都包含對另一個接收者的引用。判斷自身能否接收請求,如果能就處理不能它就會把相同的請求傳給下一個接收者,依此類推 | ? | ? | 例如Winform的單擊請求,你想觸發(fā)布局在底層的控件事件時,那么就要設(shè)置上層的控件都無法處理單擊請求 |
| 21 | 命令模式 | 把用戶可以觸發(fā)的功能當(dāng)成一個命令 | 方法參數(shù)個數(shù),參數(shù)的數(shù)據(jù)類型,返回值可能不統(tǒng)一。用戶卻想要統(tǒng)一的接口 | 創(chuàng)建用戶想要的命令接口,保留原實體的成員變量和getter&setter。 把方法變成類,并繼承和實現(xiàn)命令接口,成員包含原先的輸入?yún)?shù)和返回值,可用構(gòu)造函數(shù)初始化。 創(chuàng)建命令執(zhí)行類,成員是 List <ICommand*> ,方法是添加ICommand 和遍歷執(zhí)行ICommand中的方法 | 方法與實體分離,可以被接收者統(tǒng)一處理。 | ? | ? |
| 22 | 訪問器模式 | 改變基類的方法會影響到派生類的實現(xiàn) | 穩(wěn)定層次結(jié)構(gòu),易變的基類方法需求 | 把原來基類和派生類的實現(xiàn)放在訪問器類中,各個派生類成員包含訪問器的引用,用來訪問這些訪問器的操作方法。而訪問器中的操作方法傳入派生類的實體,對派生類的屬性進行操作,返回值用成員變量保存。這樣要變更操作方法只需要變更具體的訪問器,而不需要變更基類和派生類。 | ? | 如果層次結(jié)構(gòu)不穩(wěn)定,那么使用訪問者模式就得不償失. | ? |
| 23 | 解釋器模式 | 定義一個語言,用戶可以用這語言來執(zhí)行相應(yīng)的操作 | ? | 非終結(jié)符和終結(jié)符的解析。實際的難點是先學(xué)會編譯原理 | ? | 解析算法才是難點 | 如正則表達(dá)式等 |
?
?
總結(jié)
以上是生活随笔為你收集整理的设计模式的理解:对23个设计模式的总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式的理解:解释器模式 Interp
- 下一篇: 架构与设计 之一 C 嵌入式设计模式(D