關聯的概念
關聯用來表示兩個或多個類的對象之間的結構關系,它在代碼中表現為一個類以屬性的形式包含對另一個類的一個或多個對象的應用。
程序演示:關聯關系(code/assocation)
假設:一個公司只有三名員工:一個員工要么沒有工作,要么只能在一個公司工作。(代碼簡化了,主要說明關聯關系)
Person類:

1 class person 2 { 3 public string name; 4 public person(string eName) 5 { 6 name = eName; 7 } 8 public void startWork() 9 { 10 Console.WriteLine("員工{0}開始工作",name); 11 } 12 }
Company類:

1 class company 2 { 3 public string name; //公司名稱 4 public person[ ] employee = new person[3]; 5 6 public company(string cName) //構造函數 7 { 8 name = cName; 9 } 10 11 public void run() 12 { 13 Console.WriteLine("公司“{0}”開始運作",name); 14 employee[0].startWork(); 15 employee[1].startWork(); 16 employee[2].startWork(); 17 } 18 19 public void stop() 20 { 21 Console.WriteLine("公司“{0}”停止運作", name); 22 } 23 }
控制台程序:

1 class Program 2 { 3 static void Main(string[] args) 4 { 5 company c = new company("北京能力有限公司"); 6 c.employee[0] = new person("張三"); 7 c.employee[1] = new person("李四"); 8 c.employee[2] = new person("王二"); 9 c.run(); 10 c.stop(); 11 Console.Read(); 12 } 13 }
輸出:
對應的類圖:
二元關聯
概念:兩個類之間的關聯成為二元關聯。
符號:
比如:在一個大公司里,公司總裁只認識那些核心職員,不認識所有的普通職員,而所有的職員都認識總裁。
1 public class 大公司總裁 2 { 3 private 核心職員 A; 4 } 5 6 public class 核心職員 7 { 8 private 大公司總裁 B; 9 } 10 11 public class 普通職員 12 { 13 private 大公司總裁 B; 14 }
對應的類圖:
單向關聯關系對應的代碼:
1 public class A 2 { 3 private B b; 4 } 5 6 public class B 7 { 8 }
雙向關聯關系對應的代碼:
1 public class A 2 { 3 private B b; 4 } 5 6 public class B 7 { 8 private A a; 9 }
關聯的名稱
關聯的名稱表達了關聯的內容,一般使用動賓結構的短語。(例如上面的類圖中:work)
關聯命名的原則是該命名是否有助於理解該模型。
關聯的角色
關聯中的角色是類的對象在關聯中所扮演的角色。例如上圖中的:employer(雇佣方),employee(員工:受雇佣的人)。關聯的角色會轉換為代碼。
1 class company 2 { 3 public string name; //公司名稱 4 public person[ ] employee = new person[3]; 5 6 public company(string cName) //構造函數 7 { 8 name = cName; 9 } 10 …… 11 }
關聯的可見性
用可見性修飾角色名稱,以說明角色名稱可以在哪些范圍內可被訪問到。
代碼:
1 class company 2 { 3 public string name; //公司名稱 // "+"
4 public person[] employee = new person[3]; 5 6 public company(string cName) //構造函數 7 { 8 name = cName; 9 } 10 …… 11 }
關聯的多重性
多重性是指有多少個對象參與了關聯。具體的說,是指類A的一個對象對應類B的對象的個數。
舉個例子說明吧:
對應代碼:
1 public class 狗 2 { 3 private 腿[] X = new 腿[4]; 4 } 5 6 public class 腿 7 { 8 …… 9 }
(就是上面的數字描述)
多重性有哪些表示?
- 1: 表示1個
- 0..*: 表示任意多個( ≥0)(*可以換成n)
- *: 表示任意多個( ≥0)
- 1..*: 表示1個或多個(≥1)
- 0..1: 表示0個或1個
- 5..11: 表示5-11個
- 1,3,8: 表示個1或3個或8個
- 0,3..8: 表示0個或3-8個
在Rose中怎么設置?
聚合與組合
聚合(聚集)與組合(合成、組成)是兩種特殊的關聯。
1、聚合(關聯的特例)
聚合的概念:聚合表示類之間的整體與部分的關系。聚合意味着一個類擁有但共享另一個類的對象。
程序演示:聚合(code/associationB)
1 class cpu 2 { 3 public string name; //品牌 4 public string rate; //主頻 5 6 public cpu(string cpuName,string cpuRate) 7 { 8 name = cpuName; 9 rate = cpuRate; 10 } 11 }
1 class computer 2 { 3 public string buyTime; 4 public string color; 5 public cpu mycpu; 6 7 public computer(string computerBuyTime,string computerColor) 8 { 9 buyTime = computerBuyTime; 10 color = computerColor; 11 } 12 public void cpuInfo() 13 { 14 Console.WriteLine("該電腦的CPU品牌為:{0}",mycpu.name); 15 Console.WriteLine("該電腦的CPU主頻為:{0}", mycpu.rate); 16 } 17 }
1 class Program 2 { 3 static void Main(string[ ] args) 4 { 5 cpu cpuA = new cpu("Intel","2.93"); 6 cpu cpuB = new cpu("AMD","2.61"); 7 8 computer computerC = new computer("2008-9-1","黑色"); 9 Console.WriteLine("購買時間為:{0}", computerC.buyTime); 10 Console.WriteLine("顏色為:{0}\n", computerC.color); 11 12 Console.WriteLine("現在安裝第一塊CPU"); 13 computerC.mycpu = cpuA; //將cpuA裝入該電腦中 14 computerC.cpuInfo(); 15 16 Console.WriteLine("\n現在安裝第二塊CPU"); 17 computerC.mycpu = cpuB; //將cpuA裝入該電腦中 18 computerC.cpuInfo(); 19 } 20 }
聚合的符號
在整體類端加空心菱形。
當整體類不存在時,不分類仍可能存在。部分類銷毀時,整體類也將能夠存在。
關聯關系和聚合關系在語法上是沒辦法區分的,得從語義上才能更好的區分兩者的區別。
2、組成
組成的概念:組成是一種特殊形式的聚合。
與聚合相比,它有兩個特點:
- 一個部分類最多只能屬於一個整體類
- 當整體類不存在時,部分類將同時被銷毀。
最容易理解的一個例子就是窗體和文本框,當窗體不存在時,文本框也將不存在。
組成的符號:
在整體類端加實心菱形。如圖:
聚合與組成的區別
關聯與聚合(包括組合)的區別
關聯關系所涉及的兩個類是處於同一個層次上的。比如學生和課程就是一種關聯關系,而不是聚合關系,因為學生不是有課程組成的。
聚合關系涉及的兩個類處於不平等的層次上,一個代表整體,一個代表部分。比如電腦和顯示器、鍵盤、主板、內存就是聚合關系,因為主板是電腦的組成部分。而鍵盤等部件不會因為電腦沒了,就不存在了。
聚合與組合的區別:
組合:整體類端的重數必須是1,部分類的重數是任意的。
聚合:整體類端的重數可以大於1,部分類的重數是任意的。
關聯關系的Rose建模
1、二元關聯關系
2、設置關聯名和角色名
3、設置多重性
4、設置關聯的可見性
5、添加雙向關聯按鈕(工具欄上默認是沒有雙向關聯的按鈕的,得自己添加)
6、聚合:(1)添加關聯,並設置關聯的名稱與角色名
(2)雙擊關聯線,彈出右窗, 選中Aggregate
7、組合:(1)添加關聯,並設置關聯的名稱與角色名
(2)雙擊關聯線,彈出右窗,選中Aggregate和By Value
總結
在介紹關聯關系中,又介紹了聚合和組合這兩種特殊的關聯,在使用的時候一定要注意這兩者的區別。容易混淆。不能按字面意義來理解......
本來打算把類圖的四種關系介紹完的,這才發現,就關聯關系也是個長篇大論了,寫的多了,你也煩,我也煩,LZ不喜歡看太長的文章,不利於理解。
好了,一起慢慢消化吧.......如果您覺得對您有點幫助,不妨點一下推薦.....
系列文章
[UML]UML系列——用例圖中的各種關系(include、extend)