課程目標設計模式
一、經過從新認識 UML,掌握 UML 的定義、特色和分類架構
二、重點介紹類圖和時序圖各圖例的含義。併發
三、掌握各類圖例和標線的記憶技巧。異步
內容定位 ➡ 適合全部的 Java 開發人員。ide
統一建模語言(Unified Modeling Language,UML)是一種爲面向對象系統的產品進行說明、可視化和編制文檔的一種標準語言,是非專利的第三代建模和規約語言。工具
UML 使用面向對象設計的的建模工具,但獨立於任何具體程序設計語言。oop
UML 是在開發階段,說明、可視化、構建和書寫一個面向對象軟件密集系統的製品的開放方法。最佳的應用是工程實踐,對大規模,複雜系統進行建模方面,特別是在軟件架構層次,已經被驗證有效。測試
UML是一種模型化語言。模型大多以圖表的方式表現出來。一份典型的建模圖表一般包含幾個塊或框,鏈接線和做爲模型附加信息之用的文本。這些雖簡單卻很是重要,在 UML 規則中相互聯繫和擴展。spa
UML 的目標是以面向對象圖的方式來描述任何類型的系統,具備很寬的應用領域。其中最經常使用的是創建軟件系統的模型,但它一樣能夠用於描述非軟件領域的系統,如機械系統、企業機構或業務過程,以及處理複雜數據的信息系統、具備實時要求的工業系統或工業過程等。設計
總之,UML 是一個通用的標準建模語言,能夠對任何具備靜態結構和動態行爲的系統進行建模,並且適用於系統開發的不一樣階段,從需求規格描述直至系統完成後的測試和維護。
UML2.0 一共有 13 種圖形(UML1.5 定義了 9 種,2.0 增長了 4 種)。分別是:用例圖、類圖、對象圖、狀態圖、活動圖、時序圖、協做圖、構件圖、部署圖 9 種,包圖、時間圖、組合結構圖、交互概覽圖 4 種。
建模的核心是模型,模型是現實的簡化,模型是真實系統的做用,它提供了系統的設計藍圖。給軟件系統建模,須要採用通用的符號語言,這種描述模型所使用的語言稱爲建模語言。下圖完整地描述了 UML 所能描述的全部事物和關係。
類:對一組具備相同屬性,方法,關係和語義的對象的描述。
接口:描述了一個類或構件的一個服務的操做集。它僅僅是定義了一組操做的規範,並無給出這組操做的具體實現(代碼)。
用例:是對一組動做序列的描述,系統執行這些動做將產生一個對特定的參與者(Actor)有價值且可觀察的結果。
包:是分組事物中最主要的,是 UML 中惟一的組織機制。
是一種擁有的關係,具備方向性。
- 若是一個類單方向的訪問另外一個類,則稱爲單向關聯(用一個箭頭的實線表示),用帶普通箭頭的實線表示,箭頭指向擁有者,
- 若是兩個類對象能夠互相訪問,則稱爲雙向關聯(用兩個箭頭或不用箭頭的實線表示),用不帶箭頭得實線表示,
- 一個對象能訪問關聯對象的數目叫作 "多重性"。
若是一個類的改動會影響到另外一個類,則兩個類之間存在依賴關係,通常而言,依賴是單向的。
- 用帶普通箭頭的虛線表示,箭頭指向被依賴者,
表示一個更泛化的元素和一個更具體的元素之間的關係,與繼承是同一個概念。
- 用帶三角箭頭的實線表示 ,箭頭指向父類,
類與接口的關係,類實現接口。
- 用帶三角箭頭的虛線表示,箭頭指向父接口,
是總體與部分的關係。當某個實體聚合成另外一個實體時,該實體還能夠是另外一個實體的部分。
- 用空心菱形的實線表示,菱形指向總體,箭頭指向個體 ,
總體與部分的關係,組合比聚合更加嚴格。
當某個實體組合成另外一個實體時,兩者具備相同的生命週期,例如手臂和腿之間存在的是組合關係。
用實心菱形的實線表示,菱形指向總體,箭頭指向個體,
在 UML 2.0 的 13 種圖形中,類圖是使用頻率最高的 UML 圖之一。類圖是描述系統中的類,以及各個類之間的關係的靜態視圖。可以讓咱們在正確編寫代碼之前對系統有一個全面的認識。類圖是一種模型類型,確切的說,是一種靜態模型類型。類圖表示類、接口和它們之間的協做關係,用於系統設計階段。
類圖用三個矩形表示,最上面的部分標識類的名稱;中間的部分標識類的屬性;最下面的部分標識類的方法,以下圖所示:
類與類之間的關係主要有六種:關聯、聚合、組合、繼承[泛化]、實現和依賴,這六種關係的箭頭表示以下:
關聯關係是類與類之間最經常使用的一種關係,表示一類對象與另外一類對象之間有聯繫。組合、聚合也屬於關聯關係,只是關聯關係的類間關係比其餘兩種要弱。
關聯關係有四種:雙向關聯、單向關聯、自關聯、多重數關聯。例如:汽車和司機,一輛汽車對應特定的司機,一個司機也能夠開多輛車。
在多重性關係中,能夠直接在關聯直線上增長一個數字,表示與之對應的另外一個類的對象的個數。
大多數狀況下,依賴關係體如今某個類的方法使用另外一個類的對象做爲參數。依賴關係是一種「使用」關係,特定事物的改變有可能會影響到使用該事物的其餘事物,在須要表示一個事物使用另外一個事物時使用依賴關係。
例如:汽車依賴汽油,若是沒有汽油,汽車將沒法行駛。
繼承關係中,子類繼承父類的全部功能,父類所具備的屬性、方法,子類應該都有。子類中除了與父類一致的信息之外,還包括額外的信息。
例如:公交車、出租車和小轎車都是汽車,他們都有名稱,而且都能在路上行駛。其類圖以下:
接口(包括抽象類)是方法的集合,在實現關係中,類實現了接口,類中的方法實現了接口聲明的全部方法。
例如:汽車和輪船都是交通工具,而交通工具只是一個可移動工具的抽象概念,船和車實現了具體移動的功能。
聚合關係也表示類之間總體與部分的關係,成員對象是總體對象的一部分,可是成員對象能夠脫離總體對象獨立存在。
例如:公交車司機和工衣、工帽是總體與部分的關係,可是能夠分開,工衣、工帽能夠穿在別的司機身上,公交司機也能夠穿別的工衣、工帽。
組合關係表示類之間總體與部分的關係,總體和部分有一致的生存期。一旦總體對象不存在,部分對象也將不存在,是同生共死的關係。
例如:人由頭部和身體組成,二者不可分割,共同存在。
這六種類關係中,組合、聚合和關聯的代碼結構同樣,能夠從關係的強弱來理解,各種關係從強到弱依次是:繼承→實現→組合→聚合→關聯→依賴。
UML 類圖是面向對象設計的輔助工具,但並不是是必須工具,因此咱們把它做爲架構師軟技能來說解。
類關係記憶技巧
箭頭方向,從子類指向父類
記憶技巧:
一、定義子類是須要經過 extends 關鍵字指定父類;
二、子類必定是知道父類定義的,但父類並不知道子類的定義;
三、只有知道對方信息時才能指向對方;
四、因此箭頭的方向是從子類指向父類。
繼承/實現,用線條鏈接兩個類
記憶技巧:
一、空心三角箭頭表示繼承或實現;
二、實線表示繼承,是 is-a 的關係,表示擴展,不虛,很結實;
三、虛線表示實現,虛線表明 "虛" 無實體。
關聯依賴,用線條鏈接兩個類
記憶技巧:
一、虛線表示依賴關係:臨時用一下,若即若離,虛無縹緲,如有若無;表示一種使用關係,一個類須要藉助另外一類來實現功能;通常是一個類將另外一個類做爲參數使用,或做爲返回值。
二、實線表示關聯關係:關係穩定,實打實的關係,鐵哥們;表示一個類對象和另外一個類對象有關聯;一般是一個類中有另外一個類對象做爲屬性。
組合聚合,用菱形表示
記憶技巧:
一、菱形就是像是一個盛東西的器皿(好比盤子);
二、聚合:空心菱形,表明空器皿裏能夠放不少相同的東西,彙集在一塊兒(箭頭方向所指的類);總體和局部的關係,二者有獨立的生命週期,是 has-a 的關係;弱關係,消極的詞:弱-空;
三、組合:實心菱形,表明器皿裏已經有實體結構的存在,生死與共;總體與局部的關係,和聚合關係對比,關係更增強烈;二者具備相同的生命週期,contains-a 的關係;強關係,積極的詞:強-滿。
注意:UML 類關係圖中,沒有實心箭頭
下面這張圖是來自《大話設計模式》這本書中,對動物衍生關係描述的類圖。這個圖很是有技術含量也很是經典,你們能夠和我一塊兒來好好理解一下。
時序圖描述對象之間消息的發送順序,強調時間順序。時序圖是一個二維圖,橫軸表示對象,縱軸表
示時間,消息在各對象之間橫向傳遞,依照時間順序縱向排列。用箭頭表示消息、用豎虛線表示對象生命線
時序圖的做用
一、展現對象之間交互的順序。將交互行爲建模爲消息傳遞,經過描述消息是如何在對象間發送和接收的來動態展現對象之間的交互;
二、相對於其餘 UML 圖,時序圖更強調交互的時間順序;
三、能夠直觀的描述併發進程。
時序圖組成元素
角色(Actor)
系統角色,能夠是人、機器、其餘系統、子系統;在時序圖中用表示。
對象(Object)
三種命名方式
一、包括對象名和類名,例如:直播課時:課時,在時序圖中,用 "對象:類" 表示;
二、只顯示類名,即表示它是一個匿名對象,例如:課程,在時序圖中,用 ":類" 表示;
三、只顯示對象名不顯示類名,例如:講師;在時序圖中,用 "對象" 表示;
命名方式的選擇
一、三種命名方式都可,哪一種最容易讓閱讀該時序圖的人理解,就選擇哪一種。
對象的排列順序
一、對象的左右順序並不重要,可是爲了做圖清晰整潔,一般應遵循如下兩個原則:把交互頻繁的對象儘量的靠攏;把初始化整個交互活動的對象放置在最左端。
生命線(Lifeline)
在時序圖中表示爲從對象圖標向下延伸的一條虛線,表示對象存在的時間。
控制焦點(Focus of Control)又稱爲激活期,
表示時間段的符號,在這個時間段內對象將執行相應的操做。能夠理解爲 Java 語言中一對大括號{ }中的內容;用小矩形表示。
消息(Message)
消息通常分爲同步消息(Synchronous Message),異步消息(Asynchronous Message)和返回消息(Return Message)。
一、消息的發送者把控制傳遞給消息的接收者,而後中止活動,等待消息的接收者放棄或者返回控制。用來表示同步的意義;
二、消息發送者經過消息把信號傳遞給消息的接收者,而後繼續本身的活動,不等待接受者返回消息或者控制。異步消息的接收者和發送者是併發工做的。
三、返回消息表示從過程調用返回。
自關聯消息
表示方法的自身調用或者一個對象內的一個方法調用另一個方法。
組合片斷
組合片斷用來解決交互執行的條件和方式,它容許在序列圖中直接表示邏輯組件,用於經過指定條件或子進程的應用區域,爲任何生命線的任何部分定義特殊條件和子進程。
組合片斷共有 13 種,名稱及含義以下:
片斷類型 | 說明 |
---|---|
Opt | 選項: 包含一個可能發生或可能不發生的序列,能夠在臨界中指定序列發生的條件。 |
Alt | 抉擇: 包含一個片斷列表,這些片斷包含備選消息序列,在任何場合下只發生一個序列。 能夠在每一個片斷中設置一個臨界來指示該片斷能夠運行的條件,else 的臨界指示其餘任何臨界都不爲True 時應運行的片斷。若是全部臨界都爲False 而且沒有else ,則不執行任何片斷。 |
Loop | 循環: 片斷重複必定次數,能夠在臨界中指示片斷重複的條件。Loop 組合片斷具備 "Min" 和 "Max" 屬性,它們指示片斷能夠重複的最小和最大次數,默認值是無限制。 |
Break | 中斷: 若是執行此片斷,則放棄序列的其他部分。可使用臨界來指示發生中斷的條件。 |
Par | 並行: 並行處理,片斷中的事件能夠交錯進行。 |
Critical | 關鍵: 用在 Par 或 Seq 片斷中,指示此片斷中的消息不得與其餘消息交錯。 |
Seq | 弱順序: 有兩個或更多操做數片斷,這些片斷必須按給定順序發生。若是消息涉及的生命線不一樣,來自不一樣片斷的消息可能會並行交錯 |
Strict | 強順序: 有兩個或更多操做數片斷,這些片斷必須按給定順序發生。 |
Consider | 考慮: 指定此片斷描述的消息列表,其餘消息可發生在運行的系統中,但對此描述來講意義不大。 在"Messages"屬性中鍵入該列表。 |
Ignore | 忽略: 此片斷未描述的消息列表,這些消息可發生在運行的系統中,但對此描述來講意義不大。 在"Messages"屬性中鍵入該列表。 |
Assert | 斷言: 操做數片斷指定惟一有效的序列。一般用在 Consider 或 Ignore 片斷中 |
Neg | 否認: 此片斷中顯示的序列不得發生。一般用在Consider 或Ignore 片斷中。 |
Ref | 引用: 引用其餘地方定義的組合片斷 |
包含一個可能發生或不發生的序列
用來指明在兩個或更多的消息序列之間的互斥的選擇,至關於經典的if..else..
抉擇在任何場合下只發生一個序列。能夠在每一個片斷中設置一個臨界來指示該片斷能夠運行的條件。else 的臨界指示其餘任何臨界都不爲True 時應運行的片斷。若是全部臨界都爲False 而且沒有else,則不執行任何片斷。
片斷重複必定次數,能夠在臨界中指示片斷重複的條件。
同時進行得兩個片斷
一、劃清邊界,識別交互的語境;
二、將所要繪製的交互場景中的角色以及對象梳理出來;
三、從觸發整個交互的某個消息開始,在生命線之間從上到下依次畫出全部消息,並註明 每一個消息的特性(如參數等)。