1. 程式人生 > >設計模式[1.起源與誕生]

設計模式[1.起源與誕生]

定義
設計模式(Design Pattern)是一套被反覆使用、多數人知曉、經過分類的、程式碼設計經驗的總結。

使用目的:為了程式碼可重用性、讓程式碼更容易被他人理解、保證程式碼可靠性。 設計模式使程式碼編寫真正工程化;設計模式是軟體工程的基石脈絡,如同大廈的結構一樣。

起源
與很多軟體工程技術一樣,模式起源於建築領域,軟體工程只有短短的幾十年,與已經擁有幾千年底蘊的建築工程相比,後者有太多值得學習和借鑑的地方。

哈佛大學的建築學博士克里斯托弗.亞歷山大,是建築學領域的模式之父。他與其研究團隊用了約20年的時間,對住宅和周邊環境進行了大量的調查研究,發現人們對舒適住宅和城市環境存在一些共同的認同規律,將它們歸納成253個模式。對每一個模式都從前提條件、目標問題、 解決方案三個方面進行了描述,並給出了從需求分析到結構設計再到經典例項的過程模型。

所以,對模式的定義可以抽象為在特定環境下,人們為了解決某類重複出現問題,而總結歸納出來的有效解決方案。

誕生
GoF將模式的概念引入軟體工程領域,這標誌著軟體模式的誕生。軟體模式並非僅限於設計模式,還包括架構模式、分析模式和過程模式等,實際上,在軟體開發生命週期的每一個階段都存在著一些被認同的模式。

軟體模式主要由四部分構成,包括待解決問題、約束條件、解決方案、優點。

軟體模式與具體的應用領域無關,也就是說無論從事的是移動開發、桌面開發、Web開發還是嵌入式軟體的開發,都可以使用軟體模式。

在軟體模式中,設計模式是研究最為深入的分支,它融合了眾多專家的設計經驗,已經在成千上萬的軟體中得以應用。 1995年, GoF將收集和整理好的23種設計模式彙編成了一本名叫《設計模式》的書,該書的出版也標誌著設計模式正式成為面向物件版軟體工程的一個重要研究分支。

設計模式分類
總體來說設計模式分為三大類:
建立型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。

結構型模式,共七種:介面卡模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。

行為型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、直譯器模式。

其實還有兩類:
併發型模式和執行緒池模式。如下圖:

這裡寫圖片描述

設計模式的六個原則
總原則:開閉原則(Open Close Principle)

開閉原則就是說對擴充套件開放,對修改關閉。在程式需要進行拓展的時候,不能去修改原有的程式碼,而是要擴充套件原有程式碼,實現一個熱插拔的效果。想要達到這樣的效果,我們需要使用介面和抽象類等。

1、單一職責原則
不要存在多於一個導致類變更的原因,也就是說每個類應該實現單一的職責,如若不然,就應該把類拆分。

2、里氏替換原則(Liskov Substitution Principle)
里氏代換原則中說,任何基類可以出現的地方,子類一定可以出現。 LSP是繼承複用的基石,只有當衍生類可以替換掉基類,軟體單位的功能不受到影響時,基類才能真正被複用,而衍生類也能夠在基類的基礎上增加新的行為。里氏代換原則是對“開-閉”原則的補充。實現“開-閉”原則的關鍵步驟就是抽象化。而基類與子類的繼承關係就是抽象化的具體實現,所以里氏代換原則是對實現抽象化的具體步驟的規範。—— From Baidu 百科

里氏替換原則中,子類對父類的方法儘量不要重寫和過載。因為父類代表了定義好的結構,通過這個規範的介面與外界互動,子類不應該隨便破壞它。

3、依賴倒轉原則(Dependence Inversion Principle)
這個是開閉原則的基礎,具體內容:面向介面程式設計,依賴於抽象而不依賴於具體。寫程式碼時用到具體類時,不與具體類互動,而與具體類的上層介面互動。

4、介面隔離原則(Interface Segregation Principle)
這個原則的意思是:每個介面中不存在子類用不到卻必須實現的方法,如果不然,就要將介面拆分。使用多個隔離的介面,比使用單個介面(多個介面方法集合到一個的介面)要好。

5、迪米特法則(最少知道原則)(Demeter Principle)
就是說:一個類對自己依賴的類知道的越少越好。也就是說無論被依賴的類多麼複雜,都應該將邏輯封裝在方法的內部,通過public方法提供給外部。這樣當被依賴的類變化時,才能最小的影響該類。

最少知道原則的另一個表達方式是:只與直接的朋友通訊。類之間只要有耦合關係,就叫朋友關係。耦合分為依賴、關聯、聚合、組合等。我們稱出現為成員變數、方法引數、方法返回值中的類為直接朋友。區域性變數、臨時變數則不是直接的朋友。我們要求陌生的類不要作為區域性變量出現在類中。

6、合成複用原則(Composite Reuse Principle)
原則是儘量首先使用合成/聚合的方式,而不是使用繼承。

總結
例如:賣房者、買房者、中介,設計模式對於我們而言相當於一箇中介。
中介包羅永珍,可以有很多種組合方式,所以不同的設計模式代表這不同型別的中介,買房者和賣房者就可以有不同的選擇。

基礎的五種設計模式:單例、工廠、抽象工廠、建造者、原型

在選取設計模式的時候可以同時採用多種,例如我們建立多個選項的時候,可以使用工廠和建造者。工廠根據type來new不同的物件,也可以建造同一物件;建造者根據函式來build不同屬性的同一物件。個人覺得工廠的適用範圍更廣泛。