什么是UML圖,在這里我就不贅述了,園子里有很多介紹UML圖的文章。
UML中描述對象和類之間相互關系的方式包括:依賴(Dependency),關聯(Association),聚合(Aggregation),組合(Composition),泛化(Generalization),實現(Realization)等。
- 依賴(Dependency):元素A的變化會影響元素B,但反之不成立,那么B和A的關系是依賴關系,B依賴A;類屬關系和實現關系在語義上講也是依賴關系,但由於其有更特殊的用途,所以被單獨描述。uml中用帶箭頭的虛線表示Dependency關系,箭頭指向被依賴元素。
- 泛化(Generalization):通常所說的繼承(特殊個體 is kind of 一般個體)關系,不必多解釋了。uml中用帶空心箭頭的實線線表示Generalization關系,箭頭指向一般個體。
- 實現(Realize):元素A定義一個約定,元素B實現這個約定,則B和A的關系是Realize,B realize A。這個關系最常用於接口。uml中用空心箭頭和虛線表示Realize關系,箭頭指向定義約定的元素。
- 關聯(Association):元素間的結構化關系,是一種弱關系,被關聯的元素間通常可以被獨立的考慮。uml中用實線表示Association關系,箭頭指向被依賴元素。
- 聚合(Aggregation):關聯關系的一種特例,表示部分和整體(整體 has a 部分)的關系。uml中用帶空心菱形頭的實線表示Aggregation關系,菱形頭指向整體。
- 組合(Composition):組合是聚合關系的變種,表示元素間更強的組合關系。如果是組合關系,如果整體被破壞則個體一定會被破壞,而聚合的個體則可能是被多個整體所共享的,不一定會隨着某個整體的破壞而被破壞。uml中用帶實心菱形頭的實線表示Composition關系,菱形頭指向整體。
其中關系由強到弱:泛化>實現>組合>聚合>關聯>依賴
一、依賴(Dependency)
表示方法:虛線加箭頭表示

依賴關系是對象之間最基本的關系,也是類與類之間的聯結。當一個對象(調用者)需要調用另外一個對象(被調用者)的方法去完成某些工作時,依賴關系就建立了。
依賴總是單向的。(Tips: 要避免雙向依賴。一般來說,不應該存在雙向依賴。)
依賴關系在 C#(Java、C++等)中體現為局部變量、方法的參數或者對靜態方法的調用。
(軟件開發中,往往會設計一些公用類,供別的類調用,如果這些公用類出問題了,那調用這些公用類的類都會因此而出問題。
兩個元素之間的一種關系,其中一個元素(提供者)的變化將影響另一個元素(客體),或向它提供所需信息顯示一個類引用另一個類)
public class Client { // 方法的參數 void call(Service service) { // 局部變量 // Service service = new Service(); // 靜態方法調用 // Service.Call(); ... } }

特點:當類與類之間有使用關系時就屬於依賴關系,不同於關聯關系,依賴不具有“擁有關系”,而是一種“相識關系”,只在某個特定地方(比如某個方法體內)才有關系。
Client依賴Service,但是Client變動不會影響Service。但是Service變動可能會影響Client(如上Service的Call方法變動一定會影響Client)。
二、關聯(Association)
表示方法:實線箭頭表示
關聯關系是類與類之間的聯結,它使一個類知道另一個類的屬性和方法。
關聯可以是雙向的,也可以是單向的(Tips:還有自身關聯)。雙向的關聯可以有兩個箭頭或者沒有箭頭,單向的關聯有一個箭頭。
依賴關系在 C#(Java、C++等)中體現為成員變量(屬性),但是沒有包含關系。
public class Teacher { } public class Student { protected List<Teacher> thList { get; set; }; }

表示方法:實線箭頭
特征:表示類與類或類與接口之間的依賴關系,表現為“擁有關系”;具體到代碼可以用實例變量來表示。(A類有一個成員變量保存的是B類的一個引用,也就是說由A類可以找到B類)
Student關聯Teacher,可以通過Student找到Teacher。Student和Teacher每有包含關系。
三、聚合(Aggregation)
表示方法:帶空心菱形箭頭表示

聚合關系是關聯關系的一種,是強的關聯關系,體現的是整體和部分之間的關系,即“has-a”關系。
聚合是整體和部分之間的關系,例如部門由員工組成。
在 C#(Java、C++等)中體現為成員變量(屬性)。但是,關聯關系所涉及的兩個類處在同一個層次上,而聚合關系中,兩個類處於不同的層次上,一個代表整體,一個代表部分。
public class Employee { } public class Department { protected List<Employee> ElList { get; set; }; }

一個Department擁有多個Employee,Department作為整體,Department中的Employee是Department的一部分。
Department和Employee都有自己的生命周期,當一個Department被撤銷時,Employee可以轉到其他Department或離職了。
Employee轉到其他Department或離職時,Department仍然是存在的。
表示方法:空心菱形頭
特征:屬於是關聯的特殊情況,體現部分-整體關系,是一種弱擁有關系;整體和部分可以有不一樣的生命周期;是一種弱關聯;
四、組合(Composition)
表示方法:帶實心菱形頭的實線表示

組合關系是關聯關系的一種,是比聚合關系還要強的關系,體現的也是整體和部分之間的關系,即“is-a”關系。
它要求普通的聚合關系中代表整體的對象負責代表部分的對象的生命周期。
簡單來說就是C#(JAVA、C++等)中的屬性。兩者之間有組成關系。
class Heart { } class Person { Heart heart { get; set; }; }

心臟是人的組成部分,不可單獨存在。
特征:屬於是關聯的特殊情況,也體現了體現部分-整體關系,是一種強“擁有關系”;整體與部分有相同的生命周期,是一種強關聯;
五、 泛化(Generalization)
表示方法:帶空心箭頭的實線線表示

泛化(下圖)表示一個更泛化的元素和一個更具體的元素之間的關系。泛化是用於對繼承進行建模的UML元素。
簡單來說就是C#(JAVA、C++等)中的繼承。一般用於類繼承類。
泛化關系表示類與類之間的繼承關系。如父和子、老虎和動物及植物和花等。
如下圖:
public class Employee { } public class Professor : Employee { }

六、實現(Realization)
表示方法:空心箭頭和虛線表示

實例(圖I)關系指定兩個實體之間的一個合同。換言之,一個實體定義一個合同,而另一個實體保證履行該合同。
簡單來說就是C#(JAVA、C++等)中的實現。一般用於類實現接口。
表達一種說明元素與實現元素之間的關系;
public interface IVehicle { void Move(); } public Car : IVehicle { public void Move() { } }

圖I
依賴、關聯、聚合和組合的區別
依賴、關聯、聚合和組合都可以泛指為”依賴關系”。
當對象之間構成關聯(Association)、聚合(Aggregation)或組合(Composition)關系時,也建立了對象之間的依賴關系。
它們表現的依賴關系強弱程度不同,這4種關系所表現的強弱程度依次為:組合(Composite) > 聚合(Aggregation) > 關聯(Association) > 依賴(Dependency)。
關聯、聚合和組合是大家經常容易混淆的3種關系,這種關系最大的區別在於對象的生命周期。
- 關聯關系:每個對象都有自己的生命周期,對象之間不存在從屬關系
- 聚合關系:整體和部分是可以分離的,整體和部分都可以擁有各自的生命周期
- 組合關系:整體和部分是不可以分離的,整體的生命周期結束時,也意味着部分的生命周期結束。
泛化與實現就是C#(Java,C++)中的繼承與實現,這兩個不難理解。
參考文獻:
使用工具:
UML: https://www.processon.com
