設計模式(design pattern)是一套被反覆使用、多數人知曉的、經過分類編目的、**設計經驗的總結。使用設計模式是為了可重用**、讓**更容易被他人理解、保證**可靠性。 毫無疑問,設計模式於己於他人於系統都是多贏的,設計模式使**編制真正工程化,設計模式是軟體工程的基石,如同大廈的一塊塊磚石一樣。
設計模式使人們可以更加簡單方便地復用成功的設計和體系結構。將已證實的技術表述成設計模式也會使新系統開發者更加容易理解其設計思路。
乙個助記名,它用一兩個詞來描述模式的問題、解決方案和效果。命名乙個新的模式增加了我們的設計詞彙。設計模式允許我們在較高的抽象層次上進行設計。基於乙個模式詞彙表,我們自己以及同事之間就可以討論模式並在編寫文件時使用它們。模式名可以幫助我們思考,便於我們與其他人交流設計思想及設計結果。找到恰當的模式名也是我們設計模式編目工作的難點之一。
描述了應該在何時使用模式。它解釋了設計問題和問題存在的前因後果,它可能描述了特定的設計問題,如怎樣用物件表示演算法等。也可能描述了導致不靈活設計的類或物件結構。有時候,問題部分會包括使用模式必須滿足的一系列先決條件。
描述了設計的組成成分,它們之間的相互關係及各自的職責和協作方式。因為模式就像乙個模板,可應用於多種不同場合,所以解決方案並不描述乙個特定而具體的設計或實現,而是提供設計問題的抽象描述和怎樣用乙個具有一般意義的元素組合(類或物件組合)來解決這個問題。
描述了模式應用的效果及使用模式應權衡的問題。儘管我們描述設計決策時,並不總提到模式效果,但它們對於評價設計選擇和理解使用模式的代價及好處具有重要意義。軟體效果大多關注對時間和空間的衡量,它們也表述了語言和實現問題。因為復用是
物件導向設計
的要素之一,所以模式效果包括它對系統的靈活性、擴充性或可移植性的影響,顯式地列出這些效果對理解和評價這些模式很有幫助。
1、工廠模式(abstract factory):客戶類和工廠類分開。消費者任何時候需要某種產品,只需向工廠請求即可。消費者無須修改就可以接納新產品。缺點是當產品修改時,工廠類也要做相應的修改。如:如何建立及如何向客戶端提供。
2、建造者模式(builder):將物件的內部表象和物件的生成過程分割開來,從而使乙個建造過程生成具有不同的內部表象的產品物件。建造模式使得產品內部表象可以獨立的變化,客戶不必知道產品內部組成的細節。建造模式可以強制實行一種分步驟進行的建造過程。
3、工廠方法模式(factory method):核心工廠類不再負責所有產品的建立,而是將具體建立的工作交給子類去做,成為乙個抽象工廠角色,僅負責給出具體工廠類必須實現的介面,而不接觸哪乙個產品類應當被例項化這種細節。
4、原始模型模式(prototype):通過給出乙個原型物件來指明所要建立的物件的型別,然後用複製這個原型物件的方法建立出更多同型別的物件。原始模型模式允許動態的增加或減少產品類,產品類不需要非得有任何事先確定的等級結構,原始模型模式適用於任何的等級結構。缺點是每乙個類都必須配備乙個轉殖方法。
5、單例模式(singleton):單例模式確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項單例模式。單例模式只應在有真正的「單一例項」的需求時才可使用。
6、介面卡/變壓器(adapter)模式:把乙個類的介面變換成客戶端所期待的另一種介面,從而使原本因介面原因不匹配而無法一起工作的兩個類能夠一起工作。適配類可以根據引數返還乙個合適的例項給客戶端。
7、橋梁模式(bridge):將抽象化與實現化脫耦,使得二者可以獨立的變化,也就是說將他們之間的強關聯變成弱關聯,也就是指在乙個軟體系統的抽象化和實現化之間使用組合/聚合關係而不是繼承關係,從而使兩者可以獨立的變化。
8、合成模式(composite):合成模式將物件組織到樹結構中,可以用來描述整體與部分的關係。合成模式就是乙個處理物件的樹結構的模式。合成模式把部分與整體的關係用樹結構表示出來。合成模式使得客戶端把乙個個單獨的成分物件和由他們復合而成的合成物件同等看待。
9、裝飾模式(decorator):裝飾模式以對客戶端透明的方式擴充套件物件的功能,是繼承關係的乙個替代方案,提供比繼承更多的靈活性。動態給乙個物件增加功能,這些功能可以再動態的撤消。增加由一些基本功能的排列組合而產生的非常大量的功能。
10、門面模式(facaed):外部與乙個子系統的通訊必須通過乙個統一的門面物件進行。門面模式提供乙個高層次的介面,使得子系統更易於使用。每乙個子系統只有乙個門面類,而且此門面類只有乙個例項,也就是說它是乙個單例模式。但整個系統可以有多個門面類。
11、享元模式(plyweight):flyweight在拳擊比賽中指最輕量級。享元模式以共享的方式高效的支援大量的細粒度物件。享元模式能做到共享的關鍵是區分內蘊狀態和外蘊狀態。內蘊狀態儲存在享元內部,不會隨環境的改變而有所不同。外蘊狀態是隨環境的改變而改變的。外蘊狀態不能影響內蘊狀態,它們是相互獨立的。將可以共享的狀態和不可以共享的狀態從常規類中區分開來,將不可以共享的狀態從類裡剔除出去。客戶端不可以直接建立被共享的物件,而應當使用乙個工廠物件負責建立被共享的物件。享元模式大幅度的降低記憶體中物件的數量。
12、**模式(proxy):**模式給某乙個物件提供乙個**物件,並由**物件控制對源物件的引用。**就是乙個人或乙個機構代表另乙個人或者乙個機構採取行動。某些情況下,客戶不想或者不能夠直接引用乙個物件,**物件可以在客戶和目標物件直接起到中介的作用。客戶端分辨不出**主題物件與真實主題物件。**模式可以並不知道真正的被**物件,而僅僅持有乙個被**物件的介面,這時候**物件不能夠建立被**物件,被**物件必須有系統的其他角色代為建立並傳入。
13、責任鏈模式(chain of responsibleity):在責任鏈模式中,很多物件由每乙個物件對其下家的引用而接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某乙個物件決定處理此請求。客戶並不知道鏈上的哪乙個物件最終處理這個請求,系統可以在不影響客戶端的情況下動態的重新組織鏈和分配責任。處理者有兩個選擇:承擔責任或者把責任推給下家。乙個請求可以最終不被任何接收端物件所接受。
14、命令模式(command):命令模式把乙個請求或者操作封裝到乙個物件中。命令模式把發出命令的責任和執行命令的責任分割開,委派給不同的物件。命令模式允許請求的一方和傳送的一方獨立開來,使得請求的一方不必知道接收請求的一方的介面,更不必知道請求是怎麼被接收,以及操作是否執行,何時被執行以及是怎麼被執行的。系統支援命令的撤消。
15、直譯器模式(interpreter):給定乙個語言後,直譯器模式可以定義出其文法的一種表示,並同時提供乙個直譯器。客戶端可以使用這個直譯器來解釋這個語言中的句子。直譯器模式將描述怎樣在有了乙個簡單的文法後,使用模式設計解釋這些語句。在直譯器模式裡面提到的語言是指任何直譯器物件能夠解釋的任何組合。在直譯器模式中需要定義乙個代表文法的命令類的等級結構,也就是一系列的組合規則。每乙個命令物件都有乙個解釋方法,代表對命令物件的解釋。命令物件的等級結構中的物件的任何排列組合都是乙個語言。
16、迭代子模式(iterator):迭代子模式可以順序訪問乙個聚集中的元素而不必暴露聚集的內部表象。多個物件聚在一起形成的總體稱之為聚集,聚集物件是能夠包容一組物件的容器物件。迭代子模式將迭代邏輯封裝到乙個獨立的子物件中,從而與聚集本身隔開。迭代子模式簡化了聚集的介面。每乙個聚集物件都可以有乙個或乙個以上的迭代子物件,每乙個迭代子的迭代狀態可以是彼此獨立的。迭代演算法可以獨立於聚集角色變化。
17、調停者模式(mediator):調停者模式包裝了一系列物件相互作用的方式,使得這些物件不必相互明顯作用。從而使他們可以鬆散偶合。當某些物件之間的作用發生改變時,不會立即影響其他的一些物件之間的作用。保證這些作用可以彼此獨立的變化。調停者模式將多對多的相互作用轉化為一對多的相互作用。調停者模式將物件的行為和協作抽象化,把物件在小尺度的行為上與其他物件的相互作用分開處理。
18、備忘錄模式(memnto):備忘錄物件是乙個用來儲存另外乙個物件內部狀態的快照的物件。備忘錄模式的用意是在不破壞封裝的條件下,將乙個物件的狀態捉住,並外部化,儲存起來,從而可以在將來合適的時候把這個物件還原到儲存起來的狀態。
19、觀察者模式(observer):觀察者模式定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某乙個主題物件。這個主題物件在狀態上發生變化時,會通知所有觀察者物件,使他們能夠自動更新自己。
20、狀態模式(state):狀態模式允許乙個物件在其內部狀態改變的時候改變行為。這個物件看上去象是改變了它的類一樣。狀態模式把所研究的物件的行為包裝在不同的狀態物件裡,每乙個狀態物件都屬於乙個抽象狀態類的乙個子類。狀態模式的意圖是讓乙個物件在其內部狀態改變的時候,其行為也隨之改變。狀態模式需要對每乙個系統可能取得的狀態創立乙個狀態類的子類。當系統的狀態變化時,系統便改變所選的子類。
21、策略模式(strategy):策略模式針對一組演算法,將每乙個演算法封裝到具有共同介面的獨立的類中,從而使得它們可以相互替換。策略模式使得演算法可以在不影響到客戶端的情況下發生變化。策略模式把行為和環境分開。環境類負責維持和查詢行為類,各種演算法在具體的策略類中提供。由於演算法和環境獨立開來,演算法的增減,修改都不會影響到環境和客戶端。
22、模板方法模式(template method):模板方法模式準備乙個抽象類,將部分邏輯以具體方法以及具體構造子的形式實現,然後宣告一些抽象方法來迫使子類實現剩餘的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩餘的邏輯有不同的實現。先制定乙個頂級邏輯框架,而將邏輯的細節留給具體的子類去實現。
23、訪問者模式(visitor):訪問者模式的目的是封裝一些施加於某種資料結構元素之上的操作。一旦這些操作需要修改的話,接受這個操作的資料結構可以保持不變。訪問者模式適用於資料結構相對未定的系統,它把資料結構和作用於結構上的操作之間的耦合解脫開,使得操作集合可以相對自由的演化。訪問者模式使得增加新的操作變的很容易,就是增加乙個新的訪問者類。訪問者模式將有關的行為集中到乙個訪問者物件中,而不是分散到乙個個的節點類中。當使用訪問者模式時,要將盡可能多的物件瀏覽邏輯放在訪問者類中,而不是放到它的子類中。訪問者模式可以跨過幾個類的等級結構訪問屬於不同的等級結構的成員類。
設計模式了解
設計模式 design pattern 是前輩們對 開發經驗的總結,是解決特定問題的一系列套路。它不是語法規定,而是一套用來提高 可復用性 可維護性 可讀性 穩健性以及安全性的解決方案。如果要強行舉例子的話,我覺得有點像古代留下的三十六計,什麼情況下用什麼計謀。什麼情況下用什麼設計模式一樣。簡單來說...
全面了解「設計模式」
其他設計模式介紹 單例模式 singleton 最易懂的設計模式解析 簡單工廠模式 factorypattern 最易懂的設計模式解析 工廠方法模式 factory method 最易懂的設計模式解析 抽象工廠模式 abstract factory 最易懂的設計模式解析 策略模式 strategy ...
了解設計模式 二
不是為了用設計模式而用設計模式 設計模式三大型別 一 建立型模式 單例模式 抽象工廠模式 建造者模式 工廠模式 原型模式。二 結構型模式 介面卡模式 橋接模式 裝飾模式 組合模式 外觀模式 享元模式 模式。三 行為型模式 模版方法模式 命令模式 迭代器模式 觀察者模式 中介者模式 備忘錄模式 直譯器...