[UML]UML系列——類圖class的關聯關係(聚合、組合)

關聯的概念

      關聯用來表示兩個或多個類的對象之間的結構關係,它在代碼中表現爲一個類以屬性的形式包含對另外一個類的一個或多個對象的應用。html

程序演示:關聯關係(code/assocation)

      假設:一個公司只有三名員工:一個員工要麼沒有工做,要麼只能在一個公司工做。(代碼簡化了,主要說明關聯關係)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     }
Person

      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  }
Company

      控制檯程序: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     }
Program

      輸出:
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 class2 { 
3   private 腿[] X = new 腿[4]; 
4 } 
5  
6 public class7 { 
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中怎麼設置?

聚合與組合

       聚合(彙集)與組合(合成、組成)是兩種特殊的關聯。

       一、聚合(關聯的特例)

       聚合的概念:聚合表示類之間的總體與部分的關係。聚合意味着一個類擁有但共享另外一個類的對象。

       程序演示:聚合(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,部分類的重數是任意的。

關聯關係的Rose建模

       一、二元關聯關係

      二、設置關聯名和角色名

      

      三、設置多重性

      四、設置關聯的可見性

      五、添加雙向關聯按鈕(工具欄上默認是沒有雙向關聯的按鈕的,得本身添加)

       六、聚合:(1)添加關聯,並設置關聯的名稱與角色名

          (2)雙擊關聯線,彈出右窗, 選中Aggregate

 

          七、組合:(1)添加關聯,並設置關聯的名稱與角色名

        (2)雙擊關聯線,彈出右窗,選中Aggregate和By Value

 

總結

      在介紹關聯關係中,又介紹了聚合和組合這兩種特殊的關聯,在使用的時候必定要注意這二者的區別。容易混淆。不能按字面意義來理解......

      原本打算把類圖的四種關係介紹完的,這才發現,就關聯關係也是個長篇大論了,寫的多了,你也煩,我也煩,LZ不喜歡看太長的文章,不利於理解。

      好了,一塊兒慢慢消化吧.......若是您以爲對您有點幫助,不妨點一下推薦.....

 系列文章

      [UML]UML系列——用例圖Use Case

      [UML]UML系列——用例圖中的各類關係(include、extend)

      [UML]UML系列——類圖Class

相關文章
相關標籤/搜索