天天看點

詳解JAVA面向對象的設計模式 (零)、GoF的23種設計模式

何為軟體設計模式

有關軟體設計模式的定義很多,有些從模式的特點來說明,有些從模式的作用來說明。本教程給出的定義是大多數學者公認的,從以下兩個方面來說明。

軟體設計模式(Software Design Pattern),又稱設計模式,是一套被反複使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。它描述了在軟體設計過程中的一些不斷重複發生的問題,以及該問題的解決方案。也就是說,它是解決特定問題的一系列套路,是前輩們的代碼設計經驗的總結,具有一定的普遍性,可以反複使用。其目的是為了提高代碼的可重用性、代碼的可讀性和代碼的可靠性。

設計模式的本質是面向對象設計原則的實際運用,是對類的封裝性、繼承性和多态性以及類的關聯關系群組合關系的充分了解。正确使用設計模式具有以下優點。

可以提高程式員的思維能力、程式設計能力和設計能力。

使程式設計更加标準化、代碼編制更加工程化,使軟體開發效率大大提高,進而縮短軟體的開發周期。

使設計的代碼可重用性高、可讀性強、可靠性高、靈活性好、可維護性強。

當然,軟體設計模式隻是一個引導。在具體的軟體幵發中,必須根據設計的應用系統的特點和要求來恰當選擇。對于簡單的程式開發,苛能寫一個簡單的算法要比引入某種設計模式更加容易。但對大項目的開發或者架構設計,用設計模式來組織代碼顯然更好。

軟體設計模式使人們可以更加簡單友善地複用成功的設計和體系結構,它通常包含以下幾個基本要素:模式名稱、别名、動機、問題、解決方案、效果、結構、模式角色、合作關系、實作方法、适用性、已知應用、例程、模式擴充和相關模式等,其中最關鍵的元素包括以下 4 個主要部分。

每一個模式都有自己的名字,通常用一兩個詞來描述,可以根據模式的問題、特點、解決方案、功能和效果來命名。模式名稱(PatternName)有助于我們了解和記憶該模式,也友善我們來讨論自己的設計。

問題(Problem)描述了該模式的應用環境,即何時使用該模式。它解釋了設計問題和問題存在的前因後果,以及必須滿足的一系列先決條件。

模式問題的解決方案(Solution)包括設計的組成成分、它們之間的互相關系及各自的職責和協作方式。因為模式就像一個模闆,可應用于多種不同場合,是以解決方案并不描述一個特定而具體的設計或實作,而是提供設計問題的抽象描述和怎樣用一個具有一般意義的元素組合(類或對象的 組合)來解決這個問題。

描述了模式的應用效果以及使用該模式應該權衡的問題,即模式的優缺點。主要是對時間和空間的衡量,以及該模式對系統的靈活性、擴充性、可移植性的影響,也考慮其實作問題。顯式地列出這些效果(Consequence)對了解和評價這些模式有很大的幫助。

GoF的23種設計模式分類

設計模式有兩種分類方法,即根據模式的目的來分和根據模式的作用的範圍來分。

根據模式是用來完成什麼工作來劃分,這種方式可分為建立型模式、結構型模式和行為型模式 3 種。

建立型模式:用于描述“怎樣建立對象”,它的主要特點是“将對象的建立與使用分離”。GoF 中提供了單例、原型、工廠方法、抽象工廠、建造者等 5 種建立型模式。

結構型模式:用于描述如何将類或對象按某種布局組成更大的結構,GoF 中提供了代理、擴充卡、橋接、裝飾、外觀、享元、組合等 7 種結構型模式。

行為型模式:用于描述類或對象之間怎樣互相協作共同完成單個對象都無法單獨完成的任務,以及怎樣配置設定職責。GoF 中提供了模闆方法、政策、指令、職責鍊、狀态、觀察者、中介者、疊代器、通路者、備忘錄、解釋器等 11 種行為型模式。

根據模式是主要用于類上還是主要用于對象上來分,這種方式可分為類模式和對象模式兩種。

類模式:用于處理類與子類之間的關系,這些關系通過繼承來建立,是靜态的,在編譯時刻便确定下來了。GoF中的工廠方法、(類)擴充卡、模闆方法、解釋器屬于該模式。

對象模式:用于處理對象之間的關系,這些關系可以通過組合或聚合來實作,在運作時刻是可以變化的,更具動态性。GoF 中除了以上 4 種,其他的都是對象模式。

表 1 介紹了這 23 種設計模式的分類。

表1GoF 的 .........

繼續閱讀