設計模式是一個很重要的內容,接下來將逐步的介紹一下經常使用的23種設計模式及其它的一些設計模式,每個設計模式都配有模板代碼和簡單測試用例方便理解,完整代碼會逐步上傳到碼雲中,連接放上:https://gitee.com/adamjiangwh/GoF。html
本篇主要介紹一下設計模式的基本原則,並給出目錄。git
設計模式是一套被反覆使用的、多數人知曉的、通過分類編目的、代碼設計經驗的總結。使用設計模式是爲了重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。編程
類的職責要單一。就一個類而言,應該僅有一個引發它變化的緣由。
設計模式
舉個簡單的例子,咱們如今不少時候都直接使用手機拍照,但新聞、時尚雜誌等的拍照使用的是相機。手機其實就至關於把相機耦合到手機中去了,而相機卻只有拍照這一個職責。大多數時候,一件產品簡單一些,職責單一一些,或許是更好的選擇,這就是單一職責原則。
markdown
若是一個類承擔的職責過多,就等於把這些職責耦合在一塊兒,一個職責的變化可能會削弱或者抑制這個類完成其它職責的能力。測試
就比如「一國兩制」,一個國家有兩種制度,沒有修改原有的管理制度,而是增長了一種新的制度。正所謂對於擴展的開放的,對於更改是封閉的。spa
高層模塊不該該依賴底層模塊,兩個都應該依賴抽象;抽象不該該依賴細節,細節應該依賴抽象。後面這句話換個方式說就是針對接口編程,不要對實現編程。設計
舉個例子,就比如你的電腦,若是CPU、內存、硬盤都須要依賴具體的主板,主板壞了,全部的部件都不能用了,這顯然是不合理的。代理
換句話說,即誰也不要依賴誰,除了約定的接口,你們均可以靈活自如。htm
子類型必須可以替換掉它們的父類型。
舉個例子,假如如今父類是鳥類,有個屬性是能夠飛,子類有個企鵝類,那麼很明顯企鵝類不能繼承鳥類,由於鳥類有會飛的屬性,若是子類企鵝類繼承父類鳥類,則企鵝必須會飛。
接口儘可能細化,同時接口中的方法儘可能少。
舉個設計模式之禪中的例子,星探找美女,星探要去找美女,他須要經過一個標準來找,好比能夠分爲外形美女和睦質美女(即兩個接口),這樣無論之後是要氣質美女仍是外形美女,均可以保持接口的穩定。
一個類對本身依賴的類知道的越少越好;一個對象應該對其餘對象有最少的瞭解。
好比體育老師上課前清點人數,他讓體育委員來替他清點人數,以後再由體育委員告知結果便可,老師自己並無接觸到其餘學生。
換句話說,每一個類都應該儘可能下降成員的訪問權限,強調了類之間的鬆耦合。
儘可能使用合成/聚合,儘可能不要使用類繼承。
合成表示一種強的「擁有」關係,體現了嚴格的部分與總體的關係,他們的生命週期相同;而聚合表示一種弱的「擁有」關係,體現的是A對象能夠包含B對象,但B對象不是A對象的一部分。
這裏再舉個簡單的例子,大雁與翅膀是合成關係;而每隻大雁都屬於一個雁羣,即一個雁羣能夠有多隻大雁,因此大雁和雁羣是聚合關係。
常見的設計模式有23種,這些模式可分爲三大類:建立型模式、結構型模式、行爲型模式。
建立型模式提供了一種在建立對象的同時隱藏建立邏輯的方式,而不是使用new運算符直接實例化對象;結構型模式主要關注類和對象的組合;行爲型模式特別關注對象間的通訊。
下面給出一個目錄,至於擴展的新模式後續有機會會繼續更新。