设计模式开篇
1. 設計模式簡介
- 設計模式(Design pattern)代表了最佳的實踐,通常被有經驗的面向對象的軟件開發人員所采用。
- 設計模式是軟件開發人員在軟件開發過程中面臨的一般問題的解決方案。這些解決方案是眾多軟件開發人員經過相當長的一段時間的試驗和錯誤總結出來的。
- 設計模式是一套被反復使用的、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。
- 設計模式使代碼編制真正工程化,設計模式是軟件工程的基石,如同大廈的一塊塊磚石一樣。
- 項目中合理地運用設計模式可以完美地解決很多問題,每種模式在現實中都有相應的原理來與之對應,每種模式都描述了一個在我們周圍不斷重復發生的問題,以及該問題的核心解決方案。
2. 什么是 GOF?
- 在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著出版了一本名為 Design Patterns - Elements of Reusable Object-Oriented Software(中文譯名:設計模式 - 可復用的面向對象軟件元素) 的書,該書首次提到了軟件開發中設計模式的概念。
? 圖書鏈接:https://book.douban.com/subject/1052241/
-
四位作者合稱 GOF(四人幫,全拼 Gang of Four)。
-
他們所提出的設計模式主要是基于以下的面向對象設計原則:
-
- 對接口編程而不是對實現編程。
- 優先使用對象組合而不是繼承。
3. 23種設計模式的類型
-
根據設計模式的參考書 Design Patterns - Elements of Reusable Object-Oriented Software(中文譯名:設計模式 - 可復用的面向對象軟件元素) 中所提到的,總共有 23 種設計模式。
-
這些模式可以分為三大類:
-
- 創建型模式(Creational Patterns)
- 結構型模式(Structural Patterns)
- 行為型模式(Behavioral Patterns)
- 還有另一類設計模式:J2EE 設計模式。
| 1 | 創建型模式 這些設計模式提供了一種在創建對象的同時隱藏創建邏輯的方式,而不是使用 new 運算符直接實例化對象。這使得程序在判斷針對某個給定實例需要創建哪些對象時更加靈活。 | 工廠模式(Factory Pattern)抽象工廠模式(Abstract Factory Pattern)單例模式(Singleton Pattern)建造者模式(Builder Pattern)原型模式(Prototype Pattern) |
| 2 | 結構型模式 這些設計模式關注類和對象的組合。繼承的概念被用來組合接口和定義組合對象獲得新功能的方式。 | 適配器模式(Adapter Pattern)橋接模式(Bridge Pattern)過濾器模式(Filter、Criteria Pattern)組合模式(Composite Pattern)裝飾器模式(Decorator Pattern)外觀模式(Facade Pattern)享元模式(Flyweight Pattern)代理模式(Proxy Pattern) |
| 3 | 行為型模式 這些設計模式特別關注對象之間的通信,負責對象間的高效溝通和職責委派。 | 責任鏈模式(Chain of Responsibility Pattern)命令模式(Command Pattern)解釋器模式(Interpreter Pattern)迭代器模式(Iterator Pattern)中介者模式(Mediator Pattern)備忘錄模式(Memento Pattern)觀察者模式(Observer Pattern)狀態模式(State Pattern)空對象模式(Null Object Pattern)策略模式(Strategy Pattern)模板模式(Template Pattern)訪問者模式(Visitor Pattern) |
| 4 | J2EE 模式 這些設計模式特別關注表示層。這些模式是由 Sun Java Center 鑒定的。 | MVC 模式(MVC Pattern)業務代表模式(Business Delegate Pattern)組合實體模式(Composite Entity Pattern)數據訪問對象模式(Data Access Object Pattern)前端控制器模式(Front Controller Pattern)攔截過濾器模式(Intercepting Filter Pattern)服務定位器模式(Service Locator Pattern)傳輸對象模式(Transfer Object Pattern) |
4. 模式之間的關系
5. 設計模式六大原則與核心思想
5.1 六大原則
1、開閉原則(Open Close Principle)
開閉原則的意思是:對擴展開放,對修改關閉。在程序需要進行拓展的時候,不能去修改原有的代碼,實現一個熱插拔的效果。簡言之,是為了使程序的擴展性好,易于維護和升級。想要達到這樣的效果,我們需要使用接口和抽象類。
2、里氏代換原則(Liskov Substitution Principle)
里氏代換原則中說,任何基類可以出現的地方,子類一定可以出現。LSP 是繼承復用的基石,只有當派生類可以替換掉基類,且軟件單位的功能不受到影響時,基類才能真正被復用,而派生類也能夠在基類的基礎上增加新的行為。里氏代換原則是對開閉原則的補充。實現開閉原則的關鍵步驟就是抽象化,而基類與子類的繼承關系就是抽象化的具體實現,所以里氏代換原則是對實現抽象化的具體步驟的規范。
3、依賴倒轉原則(Dependence Inversion Principle)
這個原則是開閉原則的基礎,具體內容:針對接口編程,依賴于抽象而不依賴于具體。
4、接口隔離原則(Interface Segregation Principle)
這個原則的意思是:使用多個隔離的接口,比使用單個接口要好。它還有另外一個意思是:降低類之間的耦合度。
5、迪米特法則,又稱最少知道原則(Demeter Principle)
最少知道原則是指:一個實體應當盡量少地與其他實體之間發生相互作用,使得系統功能模塊相對獨立。
6、合成復用原則(Composite Reuse Principle)
合成復用原則是指:盡量使用合成/聚合的方式,而不是使用繼承。
5.2 核心思想
6. 類之間的關系
在類之間, 最常見的關系有:
6.1 泛化/繼承
- 含義:繼承指的是一個類(稱為子類、子接口)繼承另外的一個類(稱為父類、父接口)的功能,并可以增加它自己的新功能的能力。
- 代碼體現:在Java中繼承關系通過關鍵字extends明確標識
- 箭頭指向:繼承用一條帶空心三角箭頭的實線表示,從子類指向父類,或者子接口指向父接口。
6.2 實現
- 含義:實現指的是一個class類實現interface接口(可以是多個)的功能,實現是類與接口之間最常見的關系。
- 代碼體現:在Java中此類關系通過關鍵字implements明確標識
- 箭頭指向:實現用一條帶空心三角箭頭的虛線表示,從類指向實現的接口。
6.3 依賴
- 含義:一種使用的關系,即一個類的實現需要另一個類的協助,要盡量不使用雙向的互相依賴.
這種使用關系是具有偶然性的、臨時性的、非常弱的,類B的變化會影響到類A。 - 代碼表現:局部變量、方法的參數或者對靜態方法的調用;類B作為方法參數(局部變量)被類A在某個method方法中使用
- 箭頭指向:用帶箭頭的虛線表示,指向被使用者
6.4 關聯
- 含義:是一種擁有的關系,它使一個類知道另一個類的屬性和方法;
這種關系比依賴更強、不存在依賴關系的偶然性、關系也不是臨時性的,一般是長期性的,而且雙方的關系一般是平等的。
如:老師與學生,丈夫與妻子關聯可以是雙向的,也可以是單向的。雙向的關聯可以有兩個箭頭或者沒有箭頭,單向的關聯有一個箭頭。 - 代碼體現:成員變量。被關聯類B以類的屬性形式出現在關聯類A中,也可能是關聯類A引用了一個類型為被關聯類B的全局變量。
- 箭頭指向: 帶普通箭頭的實心線,指向被擁有者
6.5 聚合
- 含義:聚合是關聯關系的一種特例,它體現的是整體與部分的關系,即has-a的關系。
此時整體與部分之間是可分離的,它們可以具有各自的生命周期,部分可以屬于多個整體對象,也可以為多個整體對象共享。
比如計算機與CPU、公司與員工的關系等,比如一個航母編隊包括海空母艦、驅護艦艇、艦載飛機及核動力攻擊潛艇等。 - 代碼體現:成員變量;和關聯關系是一致的,只能從語義級別來區分
- 箭頭指向:帶空心菱形的實心線,菱形指向整體
6.6 組合
- 含義:組合也是關聯關系的一種特例,它體現的是一種contains-a的關系,這種關系比聚合更強,也稱為強聚合。它同樣體現整體與部分間的關系,但此時整體與部分是不可分的,整體的生命周期結束也就意味著部分的生命周期結束,
比如人和人的大腦。比如公司和部門是整體和部分的關系,沒有公司就不存在部門。 - 代碼體現:成員變量;和關聯關系是一致的,只能從語義級別來區分
- 箭頭指向:帶實心菱形的實線,菱形指向整體
6.7 強弱順序
各種關系的強弱順序:泛化/繼承 = 實現 > 組合 > 聚合 > 關聯 > 依賴
6.8 一張圖融會貫通
下面這張UML圖,比較形象地展示了各種類圖關系:
總結
- 上一篇: 会话管理:Session与Cookie
- 下一篇: 工厂与抽象工厂