1. 程式人生 > >uml 圖學習記錄

uml 圖學習記錄

UML類圖與類的關係詳解

2011-04-21 來源:網路

在畫類圖的時候,理清類和類之間的關係是重點。類的關係有泛化(Generalization)、實現(Realization)、依賴(Dependency)和關聯(Association)。其中關聯又分為一般關聯關係和聚合關係(Aggregation),合成關係(Composition)。下面我們結合例項理解這些關係。

基本概念

類圖(Class Diagram): 類圖是面向物件系統建模中最常用和最重要的圖,是定義其它圖的基礎。類圖主要是用來顯示系統中的類、介面以及它們之間的靜態結構和關係的一種靜態模型。

類圖的3個基本元件:類名、屬性、方法。 

泛化(generalization):表示is-a的關係,是物件之間耦合度最大的一種關係,子類繼承父類的所有細節。直接使用語言中的繼承表達。在類圖中使用帶三角箭頭的實線表示,箭頭從子類指向父類。

實現(Realization):在類圖中就是介面和實現的關係。這個沒什麼好講的。在類圖中使用帶三角箭頭的虛線表示,箭頭從實現類指向介面。

依賴(Dependency):物件之間最弱的一種關聯方式,是臨時性的關聯。程式碼中一般指由區域性變數、函式引數、返回值建立的對於其他物件的呼叫關係。一個類呼叫被依賴類中的某些方法而得以完成這個類的一些職責。在類圖使用帶箭頭的虛線表示,箭頭從使用類指向被依賴的類。

關聯(Association) : 物件之間一種引用關係,比如客戶類與訂單類之間的關係。這種關係通常使用類的屬性表達。關聯又分為一般關聯、聚合關聯與組合關聯。後兩種在後面分析。在類圖使用帶箭頭的實線表示,箭頭從使用類指向被關聯的類。可以是單向和雙向。

聚合(Aggregation) : 表示has-a的關係,是一種不穩定的包含關係。較強於一般關聯,有整體與區域性的關係,並且沒有了整體,區域性也可單獨存在。如公司和員工的關係,公司包含員工,但如果公司倒閉,員工依然可以換公司。在類圖使用空心的菱形表示,菱形從區域性指向整體。

組合(Composition) : 表示contains-a的關係,是一種強烈的包含關係。組合類負責被組合類的生命週期。是一種更強的聚合關係。部分不能脫離整體存在。如公司和部門的關係,沒有了公司,部門也不能存在了;調查問卷中問題和選項的關係;訂單和訂單選項的關係。在類圖使用實心的菱形表示,菱形從區域性指向整體。

多重性(Multiplicity) : 通常在關聯、聚合、組合中使用。就是代表有多少個關聯物件存在。使用數字..星號(數字)表示。如下圖,一個割接通知可以關聯0個到N個故障單。

聚合和組合的區別

這兩個比較難理解,重點說一下。聚合和組合的區別在於:聚合關係是“has-a”關係,組合關係是“contains-a”關係;聚合關係表示整體與部分的關係比較弱,而組合比較強;聚合關係中代表部分事物的物件與代表聚合事物的物件的生存期無關,一旦刪除了聚合物件不一定就刪除了代表部分事物的物件。組合中一旦刪除了組合物件,同時也就刪除了代表部分事物的物件。

例項分析

聯通客戶響應OSS。系統有故障單、業務開通、資源核查、割接、業務重保、網路品質效能等功能模組。現在我們抽出部分需求做為例子講解。

大家可以參照著類圖,好好理解。

1. 通知分為一般通知、割接通知、重保通知。這個是繼承關係。

2. NoticeService和實現類NoticeServiceImpl是實現關係。

3. NoticeServiceImpl通過save方法的引數引用Notice,是依賴關係。同時呼叫了BaseDao完成功能,也是依賴關係。

4. 割接通知和故障單之間通過中間類(通知電路)關聯,是一般關聯。

5. 重保通知和預案庫間是聚合關係。因為預案庫可以事先錄入,和重保通知沒有必然聯絡,可以獨立存在。在系統中是手工從列表中選擇。刪除重保通知,不影響預案。

6. 割接通知和需求單之間是聚合關係。同理,需求單可以獨立於割接通知存在。也就是說刪除割接通知,不影響需求單。

7. 通知和回覆是組合關係。因為回覆不能獨立於通知存在。也就是說刪除通知,該條通知對應的回覆也要級聯刪除。

經過以上的分析,相信大家對類的關係已經有比較好的理解了。大家有什麼其它想法或好的見解,歡迎拍磚。

PS:還是那句話:以上類圖用Enterprise Architect 7.5所畫,在此推薦一下EA,非常不錯。可以替代Visio和Rose了。Visio功能不夠強大,Rose太重。唯有EA比較合適。

參考二:

深入淺出UML類圖

作者:劉偉 ,釋出於:2012-11-23,來源:CSDN

在UML 2.0的13種圖形中,類圖是使用頻率最高的UML圖之一。Martin Fowler在其著作《UML Distilled: A Brief Guide to the Standard Object Modeling Language, Third Edition》(《UML精粹:標準物件建模語言簡明指南(第3版)》)中有這麼一段:“If someone were to come up to you in a dark alley and say, 'Psst, wanna see a UML diagram?' that diagram would probably be a class diagram. The majority of UML diagrams I see are class diagrams.”(“如果有人在黑暗的小巷中向你走來並對你說:‘嘿,想不想看一張UML圖?’那麼這張圖很有可能就是一張類圖,我所見過的大部分的UML圖都是類圖”),由此可見類圖的重要性。

類圖用於描述系統中所包含的類以及它們之間的相互關係,幫助人們簡化對系統的理解,它是系統分析和設計階段的重要產物,也是系統編碼和測試的重要模型依據。

1. 類

類(Class)封裝了資料和行為,是面向物件的重要組成部分,它是具有相同屬性、操作、關係的物件集合的總稱。在系統中,每個類都具有一定的職責,職責指的是類要完成什麼樣的功能,要承擔什麼樣的義務。一個類可以有多種職責,設計得好的類一般只有一種職責。在定義類的時候,將類的職責分解成為類的屬性和操作(即方法)。類的屬性即類的資料職責,類的操作即類的行為職責。設計類是面向物件設計中最重要的組成部分,也是最複雜和最耗時的部分。

在軟體系統執行時,類將被例項化成物件(Object),物件對應於某個具體的事物,是類的例項(Instance)。

類圖(Class Diagram)使用出現在系統中的不同類來描述系統的靜態結構,它用來描述不同的類以及它們之間的關係。

在系統分析與設計階段,類通常可以分為三種,分別是實體類(Entity Class)、控制類(Control Class)和邊界類(Boundary Class),下面對這三種類加以簡要說明:

(1) 實體類:實體類對應系統需求中的每個實體,它們通常需要儲存在永久儲存體中,一般使用資料庫表或檔案來記錄,實體類既包括儲存和傳遞資料的類,還包括操作資料的類。實體類來源於需求說明中的名詞,如學生、商品等。

(2) 控制類:控制類用於體現應用程式的執行邏輯,提供相應的業務操作,將控制類抽象出來可以降低介面和資料庫之間的耦合度。控制類一般是由動賓結構的短語(動詞+名詞)轉化來的名詞,如增加商品對應有一個商品增加類,註冊對應有一個使用者註冊類等

(3) 邊界類:邊界類用於對外部使用者與系統之間的互動物件進行抽象,主要包括介面類,如對話方塊、視窗、選單等。

在面向物件分析和設計的初級階段,通常首先識別出實體類,繪製初始類圖,此時的類圖也可稱為領域模型,包括實體類及其它們之間的相互關係。

2. 類的UML圖示

在UML中,類使用包含類名、屬性和操作且帶有分隔線的長方形來表示,如定義一個Employee類,它包含屬性name、age和email,以及操作modifyInfo(),在UML類圖中該類如圖1所示:

圖1 類的UML圖示

圖1對應的Java程式碼片段如下:

public class Employee {
	private String name;
	private int age;
	private String email;
	
	public void modifyInfo() {
		......
	}
}

在UML類圖中,類一般由三部分組成:

(1) 第一部分是類名:每個類都必須有一個名字,類名是一個字串。

(2) 第二部分是類的屬性(Attributes):屬性是指類的性質,即類的成員變數。一個類可以有任意多個屬性,也可以沒有屬性

UML規定屬性的表示方式為:

可見性 名稱:型別 [ = 預設值 ]

其中:

  • “可見性”表示該屬性對於類外的元素而言是否可見,包括公有(public)、私有(private)和受保護(protected)三種,在類圖中分別用符號+、-和#表示。
  • “名稱”表示屬性名,用一個字串表示。
  • “型別”表示屬性的資料型別,可以是基本資料型別,也可以是使用者自定義型別。
  • “預設值”是一個可選項,即屬性的初始值。

(3) 第三部分是類的操作(Operations):操作是類的任意一個例項物件都可以使用的行為,是類的成員方法。

UML規定操作的表示方式為:

可見性 名稱(引數列表) [ : 返回型別]

其中:

  • “可見性”的定義與屬性的可見性定義相同。
  • “名稱”即方法名,用一個字串表示。
  • “引數列表”表示方法的引數,其語法與屬性的定義相似,引數個數是任意的,多個引數之間用逗號“,”隔開。
  • “返回型別”是一個可選項,表示方法的返回值型別,依賴於具體的程式語言,可以是基本資料型別,也可以是使用者自定義型別,還可以是空型別(void),如果是構造方法,則無返回型別。

在類圖2中,操作method1的可見性為public(+),帶入了一個Object型別的引數par,返回值為空(void);操作method2的可見性為protected(#),無引數,返回值為String型別;操作method3的可見性為private(-),包含兩個引數,其中一個引數為int型別,另一個為int[]型別,返回值為int型別。

圖2 類圖操作說明示意圖

由於在Java語言中允許出現內部類,因此可能會出現包含四個部分的類圖,如圖3所示:

圖3 包含內部類的類圖

類與類之間的關係(1)

在軟體系統中,類並不是孤立存在的,類與類之間存在各種關係,對於不同型別的關係,UML提供了不同的表示方式。

1. 關聯關係

關聯(Association)關係是類與類之間最常用的一種關係,它是一種結構化關係,用於表示一類物件與另一類物件之間有聯絡,如汽車和輪胎、師傅和徒弟、班級和學生等等。在UML類圖中,用實線連線有關聯關係的物件所對應的類,在使用Java、C#和C++等程式語言實現關聯關係時,通常將一個類的物件作為另一個類的成員變數。在使用類圖表示關聯關係時可以在關聯線上標註角色名,一般使用一個表示兩者之間關係的動詞或者名詞表示角色名(有時該名詞為例項物件名),關係的兩端代表兩種不同的角色,因此在一個關聯關係中可以包含兩個角色名,角色名不是必須的,可以根據需要增加,其目的是使類之間的關係更加明確。

如在一個登入介面類LoginForm中包含一個JButton型別的註冊按鈕loginButton,它們之間可以表示為關聯關係,程式碼實現時可以在LoginForm中定義一個名為loginButton的屬性物件,其型別為JButton。如圖1所示:

圖1 關聯關係例項

圖1對應的Java程式碼片段如下:

public class LoginForm {
private JButton loginButton; //定義為成員變數
……
}

public class JButton {
    ……
}

在UML中,關聯關係通常又包含如下幾種形式:

(1) 雙向關聯

預設情況下,關聯是雙向的。例如:顧客(Customer)購買商品(Product)並擁有商品,反之,賣出的商品總有某個顧客與之相關聯。因此,Customer類和Product類之間具有雙向關聯關係,如圖2所示:

圖2 雙向關聯例項

圖2對應的Java程式碼片段如下:

public class Customer {
private Product[] products;
……
}

public class Product {
private Customer customer;
……
}

(2) 單向關聯

類的關聯關係也可以是單向的,單向關聯用帶箭頭的實線表示。例如:顧客(Customer)擁有地址(Address),則Customer類與Address類具有單向關聯關係,如圖3所示:

圖3 單向關聯例項

圖3對應的Java程式碼片段如下:

public class Customer {
private Address address;
……
}

public class Address {
……
}

(3) 自關聯

在系統中可能會存在一些類的屬性物件型別為該類本身,這種特殊的關聯關係稱為自關聯。例如:一個節點類(Node)的成員又是節點Node型別的物件,如圖4所示:

圖4 自關聯例項

圖4對應的Java程式碼片段如下:

public class Node {
private Node subNode;
……
}

(4) 多重性關聯

多重性關聯關係又稱為重數性(Multiplicity)關聯關係,表示兩個關聯物件在數量上的對應關係。在UML中,物件之間的多重性可以直接在關聯直線上用一個數字或一個數字範圍表示。

物件之間可以存在多種多重性關聯關係,常見的多重性表示方式如表1所示:

表1 多重性表示方式列表

表示方式 多重性說明
1..1 表示另一個類的一個物件只與該類的一個物件有關係
0..* 表示另一個類的一個物件與該類的零個或多個物件有關係
1..* 表示另一個類的一個物件與該類的一個或多個物件有關係
0..1 表示另一個類的一個物件沒有或只與該類的一個物件有關係
m..n 表示另一個類的一個物件與該類最少m,最多n個物件有關係 (m≤n)

例如:一個介面(Form)可以擁有零個或多個按鈕(Button),但是一個按鈕只能屬於一個介面,因此,一個Form類的物件可以與零個或多個Button類的物件相關聯,但一個Button類的物件只能與一個Form類的物件關聯,如圖5所示:

圖5 多重性關聯例項

圖5對應的Java程式碼片段如下:

public class Form {
private Button[] buttons; //定義一個集合物件
……
}

public class Button {
……
}

(5) 聚合關係

聚合(Aggregation)關係表示整體與部分的關係。在聚合關係中,成員物件是整體物件的一部分,但是成員物件可以脫離整體物件獨立存在。在UML中,聚合關係用帶空心菱形的直線表示。例如:汽車發動機(Engine)是汽車(Car)的組成部分,但是汽車發動機可以獨立存在,因此,汽車和發動機是聚合關係,如圖6所示:

圖6 聚合關係例項

在程式碼實現聚合關係時,成員物件通常作為構造方法、Setter方法或業務方法的引數注入到整體物件中,圖6對應的Java程式碼片段如下:

public class Car {
	private Engine engine;

    //構造注入
	public Car(Engine engine) {
		this.engine = engine;
	}
    
    //設值注入
public void setEngine(Engine engine) {
    this.engine = engine;
}
……
}

public class Engine {
	……
} 

(6) 組合關係

組合(Composition)關係也表示類之間整體和部分的關係,但是在組合關係中整體物件可以控制成員物件的生命週期,一旦整體物件不存在,成員物件也將不存在,成員物件與整體物件之間具有同生共死的關係。在UML中,組合關係用帶實心菱形的直線表示。例如:人的頭(Head)與嘴巴(Mouth),嘴巴是頭的組成部分之一,而且如果頭沒了,嘴巴也就沒了,因此頭和嘴巴是組合關係,如圖7所示:

圖7 組合關係例項

在程式碼實現組合關係時,通常在整體類的構造方法中直接例項化成員類,圖7對應的Java程式碼片段如下:

public class Head {
	private Mouth mouth;

	public Head() {
		mouth = new Mouth(); //例項化成員類
	}
……
}

public class Mouth {
	……
} 

類與類之間的關係(2)

2. 依賴關係

依賴(Dependency)關係是一種使用關係,特定事物的改變有可能會影響到使用該事物的其他事物,在需要表示一個事物使用另一個事物時使用依賴關係。大多數情況下,依賴關係體現在某個類的方法使用另一個類的物件作為引數。在UML中,依賴關係用帶箭頭的虛線表示,由依賴的一方指向被依賴的一方。例如:駕駛員開車,在Driver類的drive()方法中將Car型別的物件car作為一個引數傳遞,以便在drive()方法中能夠呼叫car的move()方法,且駕駛員的drive()方法依賴車的move()方法,因此類Driver依賴類Car,如圖1所示:

圖1 依賴關係例項

在系統實施階段,依賴關係通常通過三種方式來實現,第一種也是最常用的一種方式是如圖1所示的將一個類的物件作為另一個類中方法的引數,第二種方式是在一個類的方法中將另一個類的物件作為其區域性變數,第三種方式是在一個類的方法中呼叫另一個類的靜態方法。圖1對應的Java程式碼片段如下:

public class Driver {
	public void drive(Car car) {
		car.move();
	}
    ……
}

public class Car {
	public void move() {
		......
	}
    ……
}  

3. 泛化關係

泛化(Generalization)關係也就是繼承關係,用於描述父類與子類之間的關係,父類又稱作基類或超類,子類又稱作派生類。在UML中,泛化關係用帶空心三角形的直線來表示。在程式碼實現時,我們使用面向物件的繼承機制來實現泛化關係,如在Java語言中使用extends關鍵字、在C++/C#中使用冒號“:”來實現。例如:Student類和Teacher類都是Person類的子類,Student類和Teacher類繼承了Person類的屬性和方法,Person類的屬性包含姓名(name)和年齡(age),每一個Student和Teacher也都具有這兩個屬性,另外Student類增加了屬性學號(studentNo),Teacher類增加了屬性教師編號(teacherNo),Person類的方法包括行走move()和說話say(),Student類和Teacher類繼承了這兩個方法,而且Student類還新增方法study(),Teacher類還新增方法teach()。如圖2所示:

圖2 泛化關係例項

圖2對應的Java程式碼片段如下:

//父類
public class Person {
protected String name;
protected int age;

public void move() {
        ……
}

    public void say() {
    ……
    }
}

//子類
public class Student extends Person {
private String studentNo;

public void study() {
    ……
    }
}

//子類
public class Teacher extends Person {
private String teacherNo;

public void teach() {
    ……
    }
}

4. 介面與實現關係

在很多面向物件語言中都引入了介面的概念,如Java、C#等,在介面中,通常沒有屬性,而且所有的操作都是抽象的,只有操作的宣告,沒有操作的實現。UML中用與類的表示法類似的方式表示介面,如圖3所示:

圖3 介面的UML圖示

介面之間也可以有與類之間關係類似的繼承關係和依賴關係,但是介面和類之間還存在一種實現(Realization)關係,在這種關係中,類實現了介面,類中的操作實現了介面中所宣告的操作。在UML中,類與介面之間的實現關係用帶空心三角形的虛線來表示。例如:定義了一個交通工具介面Vehicle,包含一個抽象操作move(),在類Ship和類Car中都實現了該move()操作,不過具體的實現細節將會不一樣,如圖4所示:

圖4 實現關係例項

實現關係在程式設計實現時,不同的面嚮物件語言也提供了不同的語法,如在Java語言中使用implements關鍵字,而在C++/C#中使用冒號“:”來實現。圖4對應的Java程式碼片段如下:

public interface Vehicle {
public void move();
}

public class Ship implements Vehicle {
public void move() {
    ……
    }
}

public class Car implements Vehicle {
public void move() {
    ……
    }
}

例項分析1——登入模組

某基於C/S的即時聊天系統登入模組功能描述如下:

使用者通過登入介面(LoginForm)輸入賬號和密碼,系統將輸入的賬號和密碼與儲存在資料庫(User)表中的使用者資訊進行比較,驗證使用者輸入是否正確,如果輸入正確則進入主介面(MainForm),否則提示“輸入錯誤”。

根據以上描述繪製初始類圖。

參考解決方案:

參考類圖如下:

考慮到系統擴充套件性,在本例項中引入了抽象資料訪問介面IUserDAO,再將具體資料訪問物件注入到業務邏輯物件中,可通過配置檔案(如XML檔案)等方式來實現,將具體的資料訪問類類名儲存在配置檔案中,如果需要更換新的具體資料訪問物件,只需修改配置檔案即可,原有程式程式碼無須做任何修改。

類說明:

類 名 說 明
LoginForm 登入視窗,省略介面元件和按鈕事件處理方法(邊界類)
LoginBO 登入業務邏輯類,封裝實現登入功能的業務邏輯(控制類)
IUserDAO 抽象資料訪問類介面,宣告對User表的資料操作方法,省略除查詢外的其他方法(實體類)
UserDAO 具體資料訪問類,實現對User表的資料操作方法,省略除查詢外的其他方法(實體類)
MainForm 主視窗(邊界類)

方法說明:

方法名 說 明
LoginForm類的LoginForm()方法 LoginForm建構函式,初始化例項成員
LoginForm類的validate()方法 介面類的驗證方法,通過呼叫業務邏輯類LoginBO的validate()方法實現對使用者輸入資訊的驗證
LoginBO類的validate()方法 業務邏輯類的驗證方法,通過呼叫資料訪問類的findUserByAccAndPwd()方法驗證使用者輸入資訊的合法性
LoginBO類的setIUserDAO()方法 Setter方法,在業務邏輯物件中注入資料訪問物件(注意:此處針對抽象資料訪問類程式設計
IUserDAO介面的findUserByAccAndPwd()方法 業務方法宣告,通過使用者賬號和密碼在資料庫中查詢使用者資訊,判斷該使用者身份的合法性
UserDAO類的findUserByAccAndPwd()方法 業務方法實現,實現在IUserDAO介面中宣告的資料訪問方法

例項分析2——註冊模組

某基於Java語言的C/S軟體需要提供註冊功能,該功能簡要描述如下:

使用者通過註冊介面(RegisterForm)輸入個人資訊,使用者點選“註冊”按鈕後將輸入的資訊通過一個封裝使用者輸入資料的物件(UserDTO)傳遞給操作資料庫的資料訪問類,為了提高系統的擴充套件性,針對不同的資料庫可能需要提供不同的資料訪問類,因此提供了資料訪問類介面,如IUserDAO,每一個具體資料訪問類都是某一個數據訪問類介面的實現類,如OracleUserDAO就是一個專門用於訪問Oracle資料庫的資料訪問類。

根據以上描述繪製類圖。為了簡化類圖,個人資訊僅包括賬號(userAccount)和密碼(userPassword),且介面類無需涉及介面細節元素。

參考解決方案:

在以上功能說明中,可以分析出該系統包括三個類和一個介面,這三個類分別是註冊介面類RegisterForm、使用者資料傳輸類UserDTO、Oracle使用者資料訪問類OracleUserDAO,介面是抽象使用者資料訪問介面IUserDAO。它們之間的關係如下:

(1) 在RegisterForm中需要使用UserDTO類傳輸資料且需要使用資料訪問類來操作資料庫,因此RegisterForm與UserDTO和IUserDAO之間存在關聯關係,在RegisterForm中可以直接例項化UserDTO,因此它們之間可以使用組合關聯。

(2) 由於資料庫型別需要靈活更換,因此在RegisterForm中不能直接例項化IUserDAO的子類,可以針對介面IUserDAO程式設計,再通過注入的方式傳入一個IUserDAO介面的子類物件(在本書後續章節中將學習如何具體實現),因此RegisterForm和IUserDAO之間具有聚合關聯關係。

(3) OracleUserDAO是實現了IUserDAO介面的子類,因此它們之間具有類與介面的實現關係。

(4) 在宣告IUserDAO介面的增加使用者資訊方法addUser()時,需要將在介面類中例項化的UserDTO物件作為引數傳遞進來,然後取出封裝在UserDTO物件中的資料插入資料庫,因此addUser()方法的函式原型可以定義為:public boolean addUser(UserDTO user),在IUserDAO的方法addUser()中將UserDTO型別的物件作為引數,故IUserDAO與UserDTO存在依賴關係。

通過以上分析,該例項參考類圖如圖1所示:

圖1 註冊功能參考類圖

注意:在繪製類圖或其他UML圖形時,可以通過註釋(Comment)來對圖中的符號或元素進行一些附加說明,如果需要詳細說明類圖中的某一方法的功能或者實現過程,可以使用如圖2所示表示方式:

圖2 類圖註釋例項

例項分析3——售票機控制程式

某運輸公司決定為新的售票機開發車票銷售的控制軟體。圖I給出了售票機的面板示意圖以及相關的控制部件。

圖I 售票機面板示意圖

售票機相關部件的作用如下所述:

(1) 目的地鍵盤用來輸入行程目的地的程式碼(例如,200表示總站)。

(2) 乘客可以通過車票鍵盤選擇車票種類(單程票、多次往返票和座席種類)。

(3) 繼續/取消鍵盤上的取消按鈕用於取消購票過程,繼續按鈕允許乘客連續購買多張票。

(4) 顯示屏顯示所有的系統輸出和使用者提示資訊。

(5) 插卡口接受MCard(現金卡),硬幣口和紙幣槽接受現金。

(6) 印表機用於輸出車票。

(7) 所有部件均可實現自檢並恢復到初始狀態。

現採用面向物件方法開發該系統,使用UML進行建模,繪製該系統的初始類圖。

參考解決方案:

參考類圖如下:

類說明:

類 名 說 明
Component 抽象部件類,所有部件類的父類
Keyboard 抽象鍵盤類
ActionKeyboard 繼續/取消鍵盤類
TicketKindKeyboard 車票種類鍵盤類
DestinationKeyboard 目的地鍵盤類
Screen 顯示屏類
CardDriver 卡驅動器類
CashSlot 現金(硬幣/紙幣)槽類
Printer 印表機類
TicketSoldSystem 售票系統類

方法說明:

方法名 說 明
Component 的init()方法 初始化部件
Component 的doSeltTest()方法 自檢
Keyboard的getSelectedKey()方法 獲取按鍵值
ActionKeyboard的getAction()方法 繼續/取消鍵盤事件處理
TicketKindKeyboard的getTicketKind()方法 車票種類鍵盤事件處理
DestinationKeyboard的getDestinationCode()方法 目的地鍵盤事件處理
Screen的showText()方法 顯示資訊
CardDriver的getCredit()方法 獲取金額
CardDriver的debitFare()方法 更新卡餘額
CardDriver的ejectMCard()方法 退卡
CashSlot的getCredit()方法 獲取金額
Printer的printTicket()方法 列印車票
Printer的ejectTicket()方法 出票
TicketSoldSystem的verifyCredit()方法 驗證金額
TicketSoldSystem的calculateFare()方法 計算費用

參考三:

在UML的

類圖中,常見的有以下幾種關係: 泛化(Generalization),  實現(Realization), 關聯(Association), 聚合(Aggregation), 組合(Composition), 依賴(Dependency)

1.       泛化(Generalization)

【泛化關係】:是一種繼承關係, 表示一般與特殊的關係, 它指定了子類如何特化父類的所有特徵和行為. 例如:老虎是動物的一種, 即有老虎的特性也有動物的共性.

【箭頭指向】:帶三角箭頭的實線,箭頭指向父類

 

2. 實現(Realization)

【實現關係】:是一種類與介面的關係, 表示類是介面所有特徵和行為的實現.

【箭頭指向】:帶三角箭頭的虛線,箭頭指向介面

3. 關聯(Association)

【關聯關係】:是一種擁有的關係, 它使一個類知道另一個類的屬性和方法;如:老師與學生,丈夫與妻子

關聯可以是雙向的,也可以是單向的。雙向的關聯可以有兩個箭頭或者沒有箭頭,單向的關聯有一個箭頭。

【程式碼體現】:成員變數

【箭頭及指向】:帶普通箭頭(或實心三角形箭頭)的實心線,指向被擁有者

上圖中,老師與學生是雙向關聯,老師有多名學生,學生也可能有多名老師。但學生與某課程間的關係為單向關聯,一名學生可能要上多門課程,課程是個抽象的東西他不擁有學生。

上圖為自身關聯:

4. 聚合(Aggregation)

【聚合關係】:是整體與部分的關係, 且部分可以離開整體而單獨存在. 如車和輪胎是整體和部分的關係, 輪胎離開車仍然可以存在.

聚合關係是關聯關係的一種,是強的關聯關係;關聯和聚合在語法上無法區分,必須考察具體的邏輯關係。

【程式碼體現】:成員變數

【箭頭及指向】:帶空心菱形的實心線,菱形指向整體

5. 組合(Composition)

【組合關係】:是整體與部分的關係, 但部分不能離開整體而單獨存在. 如公司和部門是整體和部分的關係, 沒有公司就不存在部門.

       組合關係是關聯關係的一種,是比聚合關係還要強的關係,它要求普通的聚合關係中代表整體的物件負責代表部分的物件的生命週期

【程式碼體現】:成員變數

【箭頭及指向】:帶實心菱形的實線,菱形指向整體

6. 依賴(Dependency)

【依賴關係】:是一種使用的關係,  即一個類的實現需要另一個類的協助, 所以要儘量不使用雙向的互相依賴.

【程式碼表現】:區域性變數、方法的引數或者對靜態方法的呼叫

【箭頭及指向】:帶箭頭的虛線,指向被使用者

 

各種關係的強弱順序:

泛化 = 實現 > 組合 > 聚合 > 關聯 > 依賴

下面這張UML圖,比較形象地展示了各種類圖關係:

====================================================

序列圖主要用於展示物件之間互動的順序。

序列圖將互動關係表示為一個二維圖。縱向是時間軸,時間沿豎線向下延伸。橫向軸代表了在協作中各獨立物件的類元角色。類元角色用生命線表示。當物件存在時,角色用一條虛線表示,當物件的過程處於啟用狀態時,生命線是一個雙道線。

訊息用從一個物件的生命線到另一個物件生命線的箭頭表示。箭頭以時間順序在圖中從上到下排列。

序列圖中涉及的元素:

1.   生命線:

生命線名稱可帶下劃線。當使用下劃線時,意味著序列圖中的生命線代表一個類的特定實體。

 

2.       同步訊息

傳送人在它繼續之前,將等待同步訊息響應

3.       非同步訊息

在傳送方繼續之前,無需等待響應的訊息

4.       註釋

5.       約束

約束的符號很簡單;格式是: [Boolean Test]

6.       組合片段

組合片段 用來解決互動執行的條件及方式。 它允許在序列圖中直接表示邏輯元件,用於通過指定條件或子程序的應用區域,為任何生命線的任何部分定義特殊條件和子程序。

常用的組合片段有:

a.       抉擇(Alt)

抉擇用來指明在兩個或更多的訊息序列之間的互斥的選擇,相當於經典的if..else..。

抉擇在任何場合下只發生一個序列。 可以在每個片段中設定一個臨界來指示該片段可以執行的條件。 else 的臨界指示其他任何臨界都不為 True 時應執行的片段。 如果所有臨界都為 False 並且沒有 else,則不執行任何片段。

 

b.       選項(Opt)

包含一個可能發生或不發生的序列

c.       迴圈(Loop)

片段重複一定次數。 可以在臨界中指示片段重複的條件。

d.       並行(Par)

 

下表列出了常用的組合片段:

片段型別

名稱

說明

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 片段中。


====================================================

用例圖主要用來描述 使用者、需求、系統功能單元 之間的關係。它展示了一個外部使用者能夠觀察到的系統功能模型圖。

【用途】:幫助開發團隊以一種視覺化的方式理解系統的功能需求。

用例圖所包含的元素如下:

1.       參與者(Actor)

表示與您的應用程式或系統進行互動的使用者、組織或外部系統。用一個小人表示。

2.       用例(Use Case)

 用例就是外部可見的系統功能,對系統提供的服務進行描述。 用橢圓表示

3.       子系統(Subsystem)

用來展示系統的一部分功能,這部分功能聯絡緊密。

4.       關係

用例圖中涉及的關係有:關聯、泛化、包含、擴充套件;

如下表所示:

關係型別

說明

表示符號

關聯

參與者與用例間的關係

泛化

參與者之間或用例之間的關係

包含

用例之間的關係

擴充套件

用例之間的關係

a.       關聯(Association)

表示參與者與用例之間的通訊,任何一方都可傳送或接受訊息。

【箭頭指向】:指向訊息接收方

 

b.      泛化(Inheritance)

就是通常理解的繼承關係,子用例和父用例相似,但表現出更特別的行為;子用例將繼承父用例的所有結構、行為和關係。子用例可以使用父用例的一段行為,也可以過載它。父用例通常是抽象的。

【箭頭指向】:指向父用例

c.       包含(Include)

包含關係用來把一個較複雜用例所表示的功能分解成較小的步驟;

【箭頭指向】:指向分解出來的功能用例

d.      擴充套件(Extend)

    擴充套件關係是指 用例功能的延伸,相當於為基礎用例提供一個附加功能。

   【箭頭指向】:指向基礎用例

e.       依賴(Dependency)

以上4中關係,是UML定義的標準關係。 但VS2010的用例模型圖中,添加了依賴關係,用帶箭頭的虛線表示

表示源用例依賴於目標用例;

【箭頭指向】:指向被依賴項

5.       專案(Artifact)

用例圖雖然是用來幫助人們形象地理解功能需求,但卻沒多少人能夠通看懂它。很多時候跟使用者交流甚至用Excel都比用例圖強,VS2010中引入了“專案”這樣一個元素,以便讓開發人員能夠在用例圖中連結一個普通文件。

用依賴關係把某個用例依賴到專案上

然後把專案-》屬性 的Hyperlink 設定到你的文件上

這樣當你在用例圖上 雙擊專案時,就會開啟相關聯的文件。

6.       註釋(Comment)

包含(include)、擴充套件(extend)、泛化(Inheritance) 的區別:

條件性:泛化中的子用例和include中的被包含的用例會無條件發生,而extend中的延伸用例的發生是有條件的;

直接性:泛化中的子用例和extend中的延伸用例為參與者提供直接服務,而include中被包含的用例為參與者提供間接服務。

對extend而言,延伸用例並不包含基礎用例的內容,基礎用例也不包含延伸用例的內容。

對Inheritance而言,子用例包含基礎用例的所有內容及其和其他用例或參與者之間的關係;

一個用例圖示例:

牢騷:

感覺用例圖還不成熟,並不能很好地表達系統的需求, 沒有UML背景的使用者幾乎不知道畫的些什麼。

其次,包含關係、擴充套件關係 的箭頭符號竟然是同樣的箭頭,僅靠上方寫個文字來加以區別,翻譯成其他語言的話,幾乎就不知道代表什麼意思。  擴充套件關係的箭頭朝向也很難理解,為何要指向基用例,而不指向擴充套件用例

VS2010新增的“專案”元素,是個很好的創新,能夠在用例圖中關聯word,excel這些文件。但為什麼不把這些功能直接整合到用例裡面,雙擊用例就彈出一份文件豈不更容易理解,非要畫蛇添足地加一個元件,僅僅為了提供個連結功能。

用例描述表:

鑑於用列圖並不能清楚地表達功能需求,開發中大家通常用描述表來補充某些不易表達的用例,下圖的表給大家提供一個參考:

相關推薦

uml 學習記錄

UML類圖與類的關係詳解 2011-04-21 來源:網路 在畫類圖的時候,理清類和類之間的關係是重點。類的關係有泛化(Generalization)、實現(Realization)、依賴(Dependency)和關聯(Association)。其中關聯又分為一般關聯關

UML學習

耗時 什麽 col 重要 employee 需求 好的 程序 相互 UML類圖學習 類 類(Class)封裝了數據和行為,是面向對象的重要組成部分,它是具有相同屬性、操作、關系的對象集合的總稱。在系統中,每個類都具有一定的職責,職責指的是類要完成什麽樣的功能

LaTex學習記錄——繪制簡單坐標

LaTex TeXstudio 操作系統:Ubuntu 14.04LTS;工具:TeXstudio;此外,我還安裝了完全的texlive(sudo apt-get install texlive-full,比較大,大家可以酌情安裝部分)。??這裏介紹一下簡單坐標圖的實現代碼,首先要註意在開頭加入要使用

PS學習記錄6--html5 canvas+js實現ps鋼筆摳

html5 canvas+js實現ps鋼筆摳圖 1. 專案要求需要用js實現photoshop中鋼筆摳圖功能,就用了近三四天的時間去解決它,最終還是基本上把他實現了。     做的過程中走了不少彎路,最終一同事找到了canvans以比較核心的屬性globalCo

PS學習記錄1.頁面製作部分之PS切

 網頁設計在技術層面上,第一步是美工做出網頁效果圖,第二步就是網頁前端進行網頁切圖。網頁切圖工具常用的有fireworks、PS,這裡使用PS進行網頁切圖。       我們通過設計稿,得到我們想要的產出物(如.png,.jpg檔案),

樹與的遍歷 學習記錄

樹與圖的深度優先遍歷,樹的DFS序、深度和重心 DFS //深度優先遍歷 dfs void dfs(int x) { v[x]=1;//記錄點x被訪問過,v是visit的縮寫 for (int i=head[x];i;i=Next[i]) { int y=ver[i

UML學習筆記

最近在學習設計模式的相關知識,所以會接觸到很多UML類圖。以前學習《軟體工程》這個課程的時候學過UML類圖,但是沒有引起重視,所以現在重新學習UML類圖的相關知識。 我們首先以一個圖示樣例來進行講解。

UML建模之包、元件和部署學習筆記

UML建模中包圖、元件圖和部署圖學習筆記 對於較大的專案進行UML建模,由於有很多的類和用例,僅僅利用類圖和用例圖的話,常常會使結構變得更為複雜。此時如果可以以功能模組劃將類圖和用例圖進行封裝,可以很好地簡化結構圖,讓開發人員或者使用人員更容易看懂整個結構或流程。此時包圖

設計模式學習--UML的繪製以及思維導的繪製

  在看設計模式的過程中,給我印象最深的是每一個模式UML圖,它能形象地將每個類的耦合關係表現出來,堪稱一個神器啊。於是,我便上網找有沒有什麼軟體能繪製UML圖,找了很久,最終在一個論壇上有人推薦說可

UML——簡單類學習

複習了一下類圖的畫法~ 就一張圖看看就明白啦~ 廢話不多說,哈哈~ Class類: 屬性和方法之前可附加的可見性修飾符: 加號(+)表示public;減號(-)表示private;#號表示pr

Linux+shell學習記錄和思維導

由於shell和Linux學習分不開,所以乾脆一起結合起來學習,順便用思維導圖工具做一個記錄。 學習的關鍵在於對著教程敲程式碼。 學習工具 思維導圖工具Xmind:以前一直用百度腦圖做一些簡單

UML建模之用例學習筆記

什麼是用例圖 用例圖是指由參與者(Actor)、用例(Use Case)以及它們之間的關係構成的用於描述系統功能的靜態檢視。 用例圖是用例(Use Case)分析手段或工具。用例分析是捕獲應用需求的有效手段,也是 UML 中進行功能需求分析的主要方法。它用參

UML繪製,理論學習

1.理論: 學習UML圖,目前我學的有三種,用例圖,類圖,時序圖。 用例圖: 主要用來描述“使用者、需求、系統功能單元”之間的關係. 主要是業務建模和需求建模。此圖,作為coder,個人認為目前瞭解就

Android應用基礎學習記錄

應用 ctp 例如 case 推薦 都沒有 變量命名規則 bytearray href 01_前言 前言,了解了Android的情況。這裏也介紹一下本文。本文是記錄學習Android應用程序開發過程,視頻中使用的Android2.2版本號,我以4.2版本號為基礎,找

[QT][SQL]sq]學習記錄1_模糊搜索

學習網 cnblogs src from log 搜索數據 城市 like .cn sql學習網站: http://www.w3school.com.cn/sql/index.asp 用於模糊搜索數據庫的數據 語句:http://www.w3school.com.cn/

學習記錄: 安裝配置自動化工具ansible

ansible學習記錄: 安裝配置ansible更新日期: 2016-11-30系統環境 :centos6.5本機ip :192.168.233.123被管理機ip :192.168.233.124—————————————————————————————————————py版本

IPProxyPool學習記錄

lib pip3 figure python3 amp library 學習 多版本 not find python3下 import sqlite3 報錯: NO module named ‘_sqlite3‘ 是因為多版本ptyhon問題,需要重新編譯python 步驟

$http學習記錄

google div 好的 pca .site log 文檔 方法 教程 火狐的網址可以直接寫文件的地址 如:D:\studyprogram\wamp\www\http.html 其他的要改成服務器下的地址 如 http://localhost\http.html 廢棄聲

tolua.setpeer學習記錄

lua 記錄 如果 進棧 get string use 輕量 peer static int tolua_bnd_setpeer(lua_State *L) { // stack: userdata, table if (!lua_isuserdata(

android adb shell and monkey 學習記錄

型號 orm -a reboot 觸摸事件 serial roc ear cpu Monkey環境: android SDK and JDK SDK目錄下的platform-tools和tools目錄要配置環境變量 查看版本: ADB 的安裝這裏就