關聯用來表示兩個或多個類的對象之間的結構關係,它在代碼中表現爲一個類以屬性的形式包含對另外一個類的一個或多個對象的應用。html
假設:一個公司只有三名員工:一個員工要麼沒有工做,要麼只能在一個公司工做。(代碼簡化了,主要說明關聯關係)ide
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 }
控制檯程序:post
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 }
輸出:url
對應的類圖:spa
概念:兩個類之間的關聯成爲二元關聯。3d
符號:code
好比:在一個大公司裏,公司總裁只認識那些核心職員,不認識全部的普通職員,而全部的職員都認識總裁。htm
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 }
(就是上面的數字描述)
多重性有哪些表示?
在Rose中怎麼設置?
聚合(彙集)與組合(合成、組成)是兩種特殊的關聯。
一、聚合(關聯的特例)
聚合的概念:聚合表示類之間的總體與部分的關係。聚合意味着一個類擁有但共享另外一個類的對象。
程序演示:聚合(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 }
聚合的符號
在總體類端加空心菱形。
當總體類不存在時,不分類仍可能存在。部分類銷燬時,總體類也將可以存在。
關聯關係和聚合關係在語法上是沒辦法區分的,得從語義上才能更好的區分二者的區別。
二、組成
組成的概念:組成是一種特殊形式的聚合。
與聚合相比,它有兩個特色:
最容易理解的一個例子就是窗體和文本框,當窗體不存在時,文本框也將不存在。
組成的符號:
在總體類端加實心菱形。如圖:
關聯關係所涉及的兩個類是處於同一個層次上的。好比學生和課程就是一種關聯關係,而不是聚合關係,由於學生不是有課程組成的。
聚合關係涉及的兩個類處於不平等的層次上,一個表明總體,一個表明部分。好比電腦和顯示器、鍵盤、主板、內存就是聚合關係,由於主板是電腦的組成部分。而鍵盤等部件不會由於電腦沒了,就不存在了。
聚合與組合的區別:
組合:總體類端的重數必須是1,部分類的重數是任意的。
聚合:總體類端的重數能夠大於1,部分類的重數是任意的。
一、二元關聯關係
二、設置關聯名和角色名
三、設置多重性
四、設置關聯的可見性
五、添加雙向關聯按鈕(工具欄上默認是沒有雙向關聯的按鈕的,得本身添加)
六、聚合:(1)添加關聯,並設置關聯的名稱與角色名
(2)雙擊關聯線,彈出右窗, 選中Aggregate
七、組合:(1)添加關聯,並設置關聯的名稱與角色名
(2)雙擊關聯線,彈出右窗,選中Aggregate和By Value
在介紹關聯關係中,又介紹了聚合和組合這兩種特殊的關聯,在使用的時候必定要注意這二者的區別。容易混淆。不能按字面意義來理解......
原本打算把類圖的四種關係介紹完的,這才發現,就關聯關係也是個長篇大論了,寫的多了,你也煩,我也煩,LZ不喜歡看太長的文章,不利於理解。
好了,一塊兒慢慢消化吧.......若是您以爲對您有點幫助,不妨點一下推薦.....
系列文章