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 所示,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/505599.html
標籤:設計模式
下一篇:設計模式概述及UML圖決議
