轉自:http://www.cnblogs.com/wolf-sun/p/3411175.html
關聯的概念
關聯用來表示兩個或多個類的對象之間的結構關係,它在代碼中表現爲一個類以屬性的形式包含對另一個類的一個或多個對象的應用。
程序演示:關聯關係(code/assocation)
假設:一個公司只有三名員工:一個員工要麼沒有工作,要麼只能在一個公司工作。(代碼簡化了,主要說明關聯關係)
Person類:
Person
Company類:
Company
控制檯程序:
Program
輸出:
對應的類圖:
二元關聯
概念:兩個類之間的關聯成爲二元關聯。
符號:
比如:在一個大公司裏,公司總裁只認識那些核心職員,不認識所有的普通職員,而所有的職員都認識總裁。
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