1、設計模式概述
1.1 軟件設計模式的產生背景
"設計模式"最初並不是出現在軟件設計中,而是被用於建築領域的設計中。
1977年美國著名建築大師、加利福尼亞大學伯克利分校環境結構中心主任克里斯托夫·亞歷山大(Christopher Alexander)
在他的著作《建築模式語言:城鎮、建築、構造》中描述了一些常見的建築設計問題,並提出了 253 種關於對城鎮、鄰里、住宅、花園和房間等進行設計的基本模式。
1990年軟件工程界開始研討設計模式的話題,後來召開了多次關於設計模式的研討會。直到1995 年,艾瑞克·伽馬(ErichGamma)、理査德·海爾姆(Richard Helm)、拉爾夫·約翰森(Ralph Johnson)、約翰·威利斯迪斯(John Vlissides)等 4 位作者合作出版了《設計模式:可複用面向對象軟件的基礎》一書,在此書中收錄了 23 個設計模式,這是設計模式領域裏程碑的事件,導致了軟件設計模式的突破。這 4 位作者在軟件開發領域裏也以他們的“四人組”(Gang of Four,GoF)著稱。
1.2 軟件設計模式的概念
軟件設計模式(Software Design Pattern),又稱設計模式,是一套被反覆使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。它描述了在軟件設計過程中的一些不斷重複發生的問題,以及該問題的解決方案。也就是說,它是解決特定問題的一系列套路,是前輩們的代碼設計經驗的總結,具有一定的普遍性,可以反覆使用。
1.3 學習設計模式的必要性
設計模式的本質是面向對象設計原則的實際運用,是對類的封裝性、繼承性和多態性以及類的關聯關係和組合關係的充分理解。
正確使用設計模式具有以下優點。
-
可以提高程序員的思維能力、編程能力和設計能力。
-
使程序設計更加標準化、代碼編制更加工程化,使軟件開發效率大大提高,從而縮短軟件的開發週期。
-
使設計的代碼可重用性高、可讀性強、可靠性高、靈活性好、可維護性強。
1.4 設計模式分類
-
創建型模式
用於描述“怎樣創建對象”,它的主要特點是“將對象的創建與使用分離”。GoF(四人組)書中提供了單例、原型、工廠方法、抽象工廠、建造者等 5 種創建型模式。
-
結構型模式
用於描述如何將類或對象按某種佈局組成更大的結構,例如建造一間房屋,用各種材料搭建起一間房屋的結構。GoF(四人組)書中提供了代理、適配器、橋接、裝飾、外觀、享元、組合等 7 種結構型模式。
-
行爲型模式
用於描述類或對象之間怎樣相互協作共同完成單個對象無法單獨完成的任務,以及怎樣分配職責。GoF(四人組)書中提供了模板方法、策略、命令、職責鏈、狀態、觀察者、中介者、迭代器、訪問者、備忘錄、解釋器等 11 種行爲型模式。
2、UML圖
統一建模語言(Unified Modeling Language,UML)是用來設計軟件的可視化建模語言。它的特點是簡單、統一、圖形化、能表達軟件設計中的動態與靜態信息。
UML 從目標系統的不同角度出發,定義了用例圖、類圖、對象圖、狀態圖、活動圖、時序圖、協作圖、構件圖、部署圖等 9 種圖。
我們主要學習的就是類圖,體現了軟件設計的靜態信息
2.1 類圖概述
類圖(Class diagram)是顯示了模型的靜態結構,特別是模型中存在的類、類的內部結構以及它們與其他類的關係等。類圖不顯示暫時性的信息。類圖是面向對象建模的主要組成部分。
2.2 類圖的作用
-
在軟件工程中,類圖是一種靜態的結構圖,描述了系統的類的集合,類的屬性和類之間的關係,可以簡化人們對系統的理解;
-
類圖是系統分析和設計階段的重要產物,是系統編碼和測試的重要模型。
2.3 類圖表示法
2.3.1 類的表示方式
在UML類圖中,類使用包含類名、屬性(field) 和方法(method) 且帶有分割線的矩形來表示,比如下圖表示一個Employee類,它包含name,age和address這3個屬性,以及work()方法。
屬性/方法名稱前加的加號和減號表示了這個屬性/方法的可見性,UML類圖中表示可見性的符號有三種:
-
+:表示public
-
-:表示private
-
#:表示protected
-
空白:表示default(默認)
屬性的完整表示方式是: 可見性 名稱 :類型 [ = 缺省值]
方法的完整表示方式是: 可見性 名稱(參數列表) [ : 返回類型]
注意:
1,中括號中的內容表示是可選的
2,也有將類型放在變量名前面,返回值類型放在方法名前面,建議大家採用標準寫法
舉個栗子:
上圖Demo類定義了三個方法:
-
method()方法:修飾符爲public,沒有參數,沒有返回值。
-
method1()方法:修飾符爲private,沒有參數,返回值類型爲String。
-
method2()方法:修飾符爲protected,接收兩個參數,第一個參數類型爲int,第二個參數類型爲String,返回值類型是int。
2.3.2 類與類之間關係的表示方式
2.3.2.1 關聯關係
關聯關係是對象之間的一種引用關係,用於表示一類對象與另一類對象之間的聯繫,如老師和學生、師傅和徒弟、丈夫和妻子等。關聯關係是類與類之間最常用的一種關係,分爲一般關聯關係、聚合關係和組合關係。我們先介紹一般關聯。
關聯又可以分爲單向關聯,雙向關聯,自關聯。
1,單向關聯
在UML類圖中單向關聯用一個帶箭頭的實線表示。上圖表示每個顧客都有一個地址,這通過讓Customer類持有一個類型爲Address的成員變量類實現。
2,雙向關聯
從上圖中我們很容易看出,所謂的雙向關聯就是雙方各自持有對方類型的成員變量。
在UML類圖中,雙向關聯用一個不帶箭頭的直線表示。上圖中在Customer類中維護一個List<Product>,表示一個顧客可以購買多個商品;在Product類中維護一個Customer類型的成員變量表示這個產品被哪個顧客所購買。
3,自關聯
自關聯在UML類圖中用一個帶有箭頭且指向自身的線表示。上圖的意思就是Node類包含類型爲Node的成員變量,也就是“自己包含自己”。
2.3.2.2 聚合關係
聚合關係是關聯關係的一種,是強關聯關係,是整體和部分之間的關係。
聚合關係也是通過成員對象來實現的,其中成員對象是整體對象的一部分,但是成員對象可以脫離整體對象而獨立存在。例如,學校與老師的關係,學校包含老師,但如果學校停辦了,老師依然存在。
在 UML 類圖中,聚合關係可以用帶空心菱形的實線來表示,菱形指向整體。下圖所示是大學和教師的關係圖:
2.3.2.3 組合關係
組合表示類之間的整體與部分的關係,但它是一種更強烈的聚合關係。
在組合關係中,整體對象可以控制部分對象的生命週期,一旦整體對象不存在,部分對象也將不存在,部分對象不能脫離整體對象而存在。例如,頭和嘴的關係,沒有了頭,嘴也就不存在了。
在 UML 類圖中,組合關係用帶實心菱形的實線來表示,菱形指向整體。下圖所示是頭和嘴的關係圖:
2.3.2.4 依賴關係
依賴關係是一種使用關係,它是對象之間耦合度最弱的一種關聯方式,是臨時性的關聯。在代碼中,某個類的方法通過局部變量、方法的參數或者對靜態方法的調用來訪問另一個類(被依賴類)中的某些方法來完成一些職責。
在 UML 類圖中,依賴關係使用帶箭頭的虛線來表示,箭頭從使用類指向被依賴的類。下圖所示是司機和汽車的關係圖,司機駕駛汽車:
2.3.2.5 繼承關係
繼承關係是對象之間耦合度最大的一種關係,表示一般與特殊的關係,是父類與子類之間的關係,是一種繼承關係。
在 UML 類圖中,繼承(泛化)關係用帶空心三角箭頭的實線來表示,箭頭從子類指向父類。在代碼實現時,使用面向對象的繼承機制來實現繼承(泛化)關係。例如,Student 類和 Teacher 類都是 Person 類的子類,其類圖如下圖所示:
2.3.2.6 實現關係
實現關係是接口與實現類之間的關係。在這種關係中,類實現了接口,類中的操作實現了接口中所聲明的所有的抽象操作。
在 UML 類圖中,實現關係使用帶空心三角箭頭的虛線來表示,箭頭從實現類指向接口。例如,汽車和船實現了交通工具,其類圖如圖 9 所示。