設計模式使人們可以更加簡單方便地復用成功的設計和體系結構。將已證實的技術表述成設計模式也會使新系統開發者更加容易理解其設計思路。
四個基本要素
1. 模式名稱(pattern name)乙個助記名,它用一兩個詞來描述模式的問題、解決方案和效果。命名乙個新的模式增加了我們的設計詞彙。設計模式允許我們在較高的抽象層次上進行設計。基於乙個模式詞彙表,我們自己以及同事之間就可以討論模式並在編寫文件時使用它們。模式名可以幫助我們思考,便於我們與其他人交流設計思想及設計結果。找到恰當的模式名也是我們設計模式編目工作的難點之一。
2. 問題(problem) 描述了應該在何時使用模式。它解釋了設計問題和問題存在的前因後果,它可能描述了特定的設計問題,如怎樣用物件表示演算法等。也可能描述了導致不靈活設計的類或物件結構。有時候,問題部分會包括使用模式必須滿足的一系列先決條件。
3. 解決方案(solution) 描述了設計的組成成分,它們之間的相互關係及各自的職責和協作方式。因為模式就像乙個模板,可應用於多種不同場合,所以解決方案並不描述乙個特定而具體的設計或實現,而是提供設計問題的抽象描述和怎樣用乙個具有一般意義的元素組合(類或物件組合)來解決這個問題。
4. 效果(consequences) 描述了模式應用的效果及使用模式應權衡的問題。儘管我們描述設計決策時,並不總提到模式效果,但它們對於評價設計選擇和理解使用模式的代價及好處具有重要意義。軟體效果大多關注對時間和空間的衡量,它們也表述了語言和實現問題。因為復用是物件導向設計的要素之一,所以模式效果包括它對系統的靈活性、擴充性或可移植性的影響,顯式地列出這些效果對理解和評價這些模式很有幫助。
一些基本的設計模式
adapter:將乙個類的介面轉換成客戶希望的另外乙個介面。adapter模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。
bridge:將抽象部分與它的實現部分分離,使它們都可以獨立地變化。
builder:將乙個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
chain of responsibility:為解除請求的傳送者和接收者之間耦合,而使多個物件都有機會處理這個請求。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有乙個物件處理它。
command:將乙個請求封裝為乙個物件,從而使你可用不同的請求對客戶進行引數化;對請求排隊或記錄請求日誌,以及支援可取消的操作。
composite:將物件組合成樹形結構以表示「部分-整體」的層次結構。它使得客戶對單個物件和復合物件的使用具有一致性。
decorator:動態地給乙個物件新增一些額外的職責。就擴充套件功能而言, 它比生成子類方式更為靈活。
facade:為子系統中的一組介面提供乙個一致的介面,facade模式定義了乙個高層介面,這個介面使得這一子系統更加容易使用。
factory method:定義乙個用於建立物件的介面,讓子類決定將哪乙個類例項化。factory method使乙個類的例項化延遲到其子類。
flyweight:運用共享技術有效地支援大量細粒度的物件。
interpreter:給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器, 該直譯器使用該表示來解釋語言中的句子。
iterator:提供一種方法順序訪問乙個聚合物件中各個元素,而又不需暴露該物件的內部表示。
mediator:用乙個中介物件來封裝一系列的物件互動。中介者使各物件不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的互動。
memento:在不破壞封裝性的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到儲存的狀態。
observer:定義物件間的一種一對多的依賴關係,以便當乙個物件的狀態發生改變時,所有依賴於它的物件都得到通知並自動重新整理。
prototype:用原型例項指定建立物件的種類,並且通過拷貝這個原型來建立新的物件。
proxy:為其他物件提供乙個**以控制對這個物件的訪問。
singleton:保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。
state:允許乙個物件在其內部狀態改變時改變它的行為。物件看起來似乎修改了它所屬的類。
strategy:定義一系列的演算法,把它們乙個個封裝起來,並且使它們可相互替換。本模式使得演算法的變化可獨立於使用它的客戶。
template method:定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中。template method使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。
visitor:表示乙個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作
設計模式的學習
設計原則 單一職責原則 低耦合,高內聚 耦合性 類與類之間產生的關係 低耦合 讓類與類之間的關係不複雜 內聚 執行乙個件事情 功能 的能力 高內聚 乙個類能夠完成的事情,不要使用多個類一起來執行 資料庫對某個資料進行增刪改查 查詢很重要的 定乙個介面 增 刪 改 查 實現類 業務邏輯層 增 2 開閉...
學習設計模式 原型設計模式
先想一下既然要建立新的例項,為什麼不直接使用 new 而要設計出乙個原型模式進行例項的複製呢?這是因為 有的時候,我們也會在不指定類名的前提下生成例項,例如像圖形編輯器中拖動現有的模型工具製作圖形的例項,這種是非常典型的生成例項的過程太過複雜,很難根據類來生成例項場景,因此需要根據現有的例項來生成新...
設計模式學習
知道設計模式已經很久了,但是一直沒有認真的去系統的學習,這幾天才開始逐漸的學習起來。下面是我學習設計模式的一些心得。要想成為一名優秀的軟體設計師或軟體架構設計師,了解一些設計模式是很有必要的。我認為學習設計模式的思路如下 一 基本概念 理解物件導向 理解重用等概念性的東西 1.什麼是物件導向?2.物...