java設計模式:概述與GoF的23種設計模式
軟件設計模式的產生背景
設計模式這個術語最初並不是出現在軟件設計中,而是被用於建築領域的設計中。
1977 年,美國著名建築大師、加利福尼亞大學伯克利分校環境結構中心主任克裏斯托夫·亞歷山大(Christopher Alexander)在他的著作《建築模式語言:城鎮、建築、構造(A Pattern Language: Towns Building Construction)中描述了一些常見的建築設計問題,並提出了 253 種關於對城鎮、鄰裏、住宅、花園和房間等進行設計的基本模式。
1979 年他的另一部經典著作《建築的永恒之道》(The Timeless Way of Building)進一步強化了設計模式的思想,為後來的建築設計指明了方向。
1987 年,肯特·貝克(Kent Beck)和沃德·坎寧安(Ward Cunningham)首先將克裏斯托夫·亞歷山大的模式思想應用在 Smalltalk 中的圖形用戶接口的生成中,但沒有引起軟件界的關註。
直到 1990 年,軟件工程界才開始研討設計模式的話題,後來召開了多次關於設計模式的研討會。
1995 年,艾瑞克·伽馬(ErichGamma)、理査德·海爾姆(Richard Helm)、拉爾夫·約翰森(Ralph Johnson)、約翰·威利斯迪斯(John Vlissides)等 4 位作者合作出版了《設計模式:可復用面向對象軟件的基礎》(Design Patterns: Elements of Reusable Object-Oriented Software)一書,在本教程中收錄了 23 個設計模式,這是設計模式領域裏程碑的事件,導致了軟件設計模式的突破。這 4 位作者在軟件開發領域裏也以他們的“四人組”(Gang of Four,GoF)匿名著稱。
直到今天,狹義的設計模式還是GoF(Gang of Four,四人組)的23種經典設計模式。
軟件設計模式的概念與意義
有關軟件設計模式的定義很多,有些從模式的特點來說明,有些從模式的作用來說明,這裏給出的定義從兩個方面來說明。
軟件設計模式的概念
軟件設計模式(Software Design Patern),簡稱設計模式,是一套被反復使用的、多數人知曉的、經過分類編目的、代碼設計經驗的總結。它描述了在軟件設計過程中的一些不斷重復發生的問題,以及該問題的解決方案。也就是說,它是解決特定問題的一系列套路,是前輩們的代碼設計經驗的總結,具有一定的普遍性,可以反復使用。其目的是為了提高代碼的可重用性、代碼的可讀性和代碼的可靠性。
學習設計模式的意義
設計模式的本質是面向對象設計原則的實際運用,是對類的封裝性、繼承性和多態性以及類的關聯關系和組合關系的充分理解。
正確使用設計模式具有以下優點:
1.可以提高程序員的思維能力、編程能力和設計能力。
2.使程序設計更加標準化、代碼編制更加工程化,使軟件開發效率大大提高,從而縮短軟件的開發周期。
3.使設計的代碼可重用性高、可讀性強、可靠性高、靈活性好、可維護性強。
當然,軟件設計模式只是一個引導,在具體的軟件開發中,必須根據設計的應用系統的特點和要求來恰當選擇。對於簡單的程序開發,可能寫一個簡單的算法要比引入某種設計模式更加容易。只是開發大項目或者是設計框架的時候,用設計模式來組織代碼顯然是更好的選擇。
軟件設計模式的基本要素
軟件設計模式使人們可以更加簡單地服用成功地設計和體系結構,它通常包含以下幾個基本要素:模式名稱、別名、冬季、問題、解決方案、效果、結構、模式角色、合作關系、實現方法、適用性、已知應用、例程、 模式擴展和相關模式等。
以下是其中最關鍵的4個主要元素:
模式名稱(PatternName)
每一個模式都有自己的名字,通常用一兩個詞來描述,可以根據模式的問題、特點、解決方案、工程和效果來命名。模式名稱有助於我們理解和記憶該模式,也方便我們來討論自己的設計。
問題(Problem)
問題描述了該模式的應用環境,即在什麽情況下使用該模式。它解釋了設計問題和問題存在的前因後果,以及必須滿足的一系列先決條件。
解決方案(Solution)
模式問題的解決方案包括設計的組成成分、它們之間的相互關系及各自的職責和協作方式。因為模式就像一個模板,可應用於多種不同場合,所以解決方案並不描述一個特定而具體的設計或實現,而是提供設計問題的抽象描述和怎樣用一個具有一般意義的元素組合(類或對象的組合)來解決問題。
效果(Consequence)
效果描述了模式的應用效果以及使用該模式應該權衡的問題,即模式的優缺點。主要是對時間和空間的衡量,以及該模式對系統的靈活性、擴展性、可移植性的影響,也考慮其實現問題。顯式地列出這些效果,對理解和評價這些模式有很大地幫助。
GoF的23中設計模式的分類
設計模式有兩種分類方法,一是根據模式的目的來分,二是根據模式的作用範圍來分。
根據目的來分(3種)
根據模式是用來完成什麽工作來劃分,這種方式可分為創建型模式、結構型模式和行為型模式3種。
創建型模式:用於描述怎樣創建對象,它的主要特點是將對象的創建與使用分離。GoF提供了單例、原型、工廠方法、抽象工廠、創造者等5種創建型模式。
結構型模式:用於描述如何將類或對象按某種布局組成更大的結構,GoF提供了代理、適配器、橋接、裝飾、外觀、享元、組合等7種結構型模式。
行為型模式:用於描述類或對象之間怎樣相互協作共同完成單個對象無法單獨完成的任務,以及怎樣分配職責。GoF提供了模板方法、策略、命令、職責鏈、狀態、觀察者、中介者、叠代器、訪問者、備忘錄、解釋器等11種行為型模式。
根據作用範圍來分(2種)
根據模式主要用於類上還是主要用於對象上來分,這種方式可分為類模式和對象模式2種。
類模式:用於處理類與子類之間的關系,這些關系通過繼承來建立,是靜態的,在編譯時刻便確定下來了。GoF的工廠方法、(類)適配器、模板方法、解釋器屬於該模式。
對象模式:用於處理對象之間的關系, 這些關系可以通過組合或聚合來實現,在運行時刻是可以變化的,更具動態性。GoF除了類模式中的4種,其它的都是對象模式。
通過二維表格能清晰看出GoF23種設計模式的分類。
範圍\目的 | 創建型模式 | 結構型模式 | 行為型模式 |
類模式 | 工廠方法(Facory Methond) | 適配器(類)(Class Adapter) |
模板方法(Template Method) 解釋器(Interpreter) |
對象模式 |
單例(Singleton) 原型(Prototype) 抽象工廠(Factory Method) 建造者(Buileder) |
代理(Proxy) 適配器(對象)(Object Adapter) 橋接(Bridge) 裝飾(Decorator) 外觀(Facade) 享元(Flyweight) 組合(Composite) |
策略(Strategy) 命令(Command) 職責鏈(Chain of Responsibility) 狀態(State) 觀察者(Observer) 中介者(Mediator) 叠代器(Iterator) 訪問者(Visitor) 備忘錄(Memento) |
GoF的23種設計模式的功能
單例模式(Singleton):
java設計模式:概述與GoF的23種設計模式