設計模式(一)----設計模式概述及UML圖解析

2022-08-10 09:00:40

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