淺談23種設計模式
類之間的關聯關系:在使用Java、C#和C++等編程語言實現關聯關系時,通常將一個類作為另一個類的屬性。
(1)雙向關聯,兩個類互相為各自的屬性,比如顧客類Customer和商品類Product,顧客擁有商品,商品與某個顧客相關聯。
(2)單向關聯,一個類作為另一個類的屬性,顧客Customer擁有地址Address,UML圖用帶箭頭的直線表示,由Customer指向Address。
(3)自關聯,此類的屬性對象類型屬于該類本身,例如節點類Node的成員又是節點對象。
(4)多重關聯,Form類的對象包含多個Button類,一個Button只與一個Form相關聯。
(5)聚合關系,是一種特殊的關聯關系,強調部分與整體,比如汽車Car和引擎Engine,引擎可以脫離汽車單獨存在,但是是汽車的組成部分,UML圖中用帶空心菱形的直線表示,由汽車指向引擎,表示汽車contains引擎。(Engine類可以在Car類的外部實例化,然后作為參數傳入Car類)
(6)組合關系,是一種特殊的關聯關系,也強調部分與整體關系,比如頭Head和嘴Mouth,Mouth不能脫離Head單獨存在,UML圖用帶實心菱形的直線表示,由Head指向Mouth,表示頭has嘴。(Mouth類在Head類的構造函數中實例化,Head銷毀則Mouth也銷毀)
*組合關系和聚合關系與普通的關聯關系主要是語義上的區別,表示關聯的程度。
類之間的依賴關系:表示某個類的方法使用另一個類的對象作為參數,UML圖用帶箭頭的虛線表示,由依賴方指向被依賴方。
泛化關系:即繼承關系,UML圖中用帶空心三角形的直線表示,例如Student類 is-a-kind-of Person類
接口與實現關系:表示類實現接口中所聲明的操作。UML圖中用帶空心三角形的虛線表示。
?
面向對象設計原則:
(1)單一職責原則:類的職責要單一,不能將太多的職責放在一個類中。
(2)開閉原則:可以在不修改一個軟件實體的基礎上去擴展其他功能。
(3)里氏代換原則:在軟件系統中,一個可以接受基類對象的地方必然可以接受一個子類對象。
(4)依賴倒轉原則:針對抽象層編程,不要針對具體類編程。
(5)接口隔離原則:使用多個專門的接口來替代一個統一的接口。
(6)合成復用原則:在系統中盡量多使用組合和聚合關系,盡量少使用甚至不使用繼承關系。
(7)迪米特法則:一個軟件實體對其他實體引用越少越好,或者說如果兩個類不必彼此直接通信,那么兩個類就不應當發生直接的相互作用,而是引入一個第三者發生間接交互。
設計模式定義:設計模式是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結,使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。
?
五種對象創建型模式:
1.工廠方法模式
工廠父類負責定義創建產品對象的公共接口,而工廠子類則負責生成具體的產品對象,這樣做的目的是將產品類的實例化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應該實例化哪一個具體產品類。
2.抽象工廠模式
提供一個創建一系列相關或依賴對象的接口,而無須指定他們具體的類。
3.建造者模式
將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。建造者模式是一步一步創建一個復雜的對象,它允許用戶只通過指定復雜對象的類型和內容就可以構建它們,用戶不需要知道內部的具體構建細節。
4.原型模式
用原型實例指定創建對象的種類,并且通過復制這些原型創建新的對象。原型模式允許一個對象再創建另外一個可定制的對象,無須知道任何創建的細節。原型模式的基本工作原理是通過將一個原型對象傳給那個要發動創建的對象,這個要發動創建的對象通過請求原型對象復制原型來實現創建過程。
5.單例模式
單例模式確保某一個類只有一個實例,而且自行實例化并向整個系統提供這個實例,這個類稱為單例類,它提供全局訪問的方法。單例模式的要點有三個:一是某個類只能有一個實例;二是它必須自行創建這個實例;三是它必須自行向整個系統提供這個實例。
七種結構型模式:
1.適配器模式
將一個接口轉換成客戶希望的另一個接口,適配器模式使接口不兼容的那些類可以一起工作。
2.橋接模式
將抽象部分與它的實現部分分離,使它們都可以獨立地變化。
3.組合模式
組合多個對象形成樹形結構以表示“整體-部分”的結構層次。組合模式對單個對象(葉子對象)和組合對象(容器對象)的使用具有一致性。
4.裝飾模式
動態地給一個對象增加一些額外的職責,就增加對象功能來說,裝飾模式比生成子類實現更為靈活。
5.外觀模式
外部與一個子系統通信必須通過一個統一的外觀對象進行,為子系統中的一組接口提供一個一致的界面,外觀模式定義了一個高層接口,這個接口使得這一子接口更加容易使用。
6.享元模式
運用共享技術有效地支持大量細粒度對象的復用。系統只使用少量的對象,而這些對象都很相似,狀態變化很小,可以實現對象的多次復用。
7.代理模式
給某一個對象提供一個代理,并由代理對象控制對原對象的引用。
十一種行為型模式:
1.職責鏈模式
避免請求發送者與接收者耦合在一起,讓多個對象都有可能接收請求,將這些對象連接成一條鏈,并且沿著這條鏈傳遞請求,直到有對象處理它為止
2.命令模式
將一個請求封裝為一個對象,從而使我們可用不同的請求對客戶進行參數化;對請求排隊或者記錄請求日志,以及支持可撤銷的操作。
3.解釋器模式
定義語法的文法,并且建立一個解釋器來解釋語言中的句子,這里的“語言”意思是使用規定格式和語法的代碼。
4.迭代器模式
提供一種方法來訪問聚合對象,而不是暴露這個對象的內部表示。
5.中介者模式
用一個中介對象來封裝一系列的對象交互,中介者使各對象不需要顯示地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。
6.備忘錄模式
在不破壞封裝的前提下,捕捉一個對象的內部狀態,并在該對象之外保存這個狀態,這樣可以在以后將對象恢復到原先保存的狀態。
7.觀察者模式
定義對象間的一種一對多依賴關系,使得每當一個對象狀態發生改變時,其相關依賴對象皆得到通知并自動更新。
8.狀態模式
允許一個對象在其內部狀態改變時改變它的行為,對象看起來似乎修改了它的類。
9.策略模式
定義一系列算法,將每一個算法封裝起來,并讓他們可以相互替換。
10.模板方法模式
定義一個操作中算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
11.訪問者模式
表示一個作用于某對象結構中的各元素的操作,它使我們可以在不改變各元素的類的前提下定義作用于這些元素的新操作。
?