UML系列——類(lèi)圖class的關(guān)聯(lián)關(guān)系(聚合沸停、組合)

原文地址: https://www.cnblogs.com/wolf-sun/p/3420120.html

關(guān)聯(lián)的概念

關(guān)聯(lián)用來(lái)表示兩個(gè)或多個(gè)類(lèi)的對(duì)象之間的結(jié)構(gòu)關(guān)系膜毁,它在代碼中表現(xiàn)為一個(gè)類(lèi)以屬性的形式包含對(duì)另一個(gè)類(lèi)的一個(gè)或多個(gè)對(duì)象的應(yīng)用。

程序演示:關(guān)聯(lián)關(guān)系(code/assocation)

假設(shè):一個(gè)公司只有三名員工:一個(gè)員工要么沒(méi)有工作愤钾,要么只能在一個(gè)公司工作瘟滨。(代碼簡(jiǎn)化了,主要說(shuō)明關(guān)聯(lián)關(guān)系)

Person類(lèi):

class person
    {
        public string name;
        public person(string eName)
        {
            name = eName;
        }
        public void startWork()
        {
            Console.WriteLine("員工{0}開(kāi)始工作",name);
        }
    }

Person

Company類(lèi):

class company
    {
        public string name;     //公司名稱(chēng)
      public person[ ] employee = new person[3]; 
     
        public company(string cName)  //構(gòu)造函數(shù)
        {
            name = cName;
        }

        public void run()
        {
            Console.WriteLine("公司“{0}”開(kāi)始運(yùn)作",name);
            employee[0].startWork();
            employee[1].startWork();
            employee[2].startWork();
        }

        public void stop()
        {
            Console.WriteLine("公司“{0}”停止運(yùn)作", name);
        }    
 }

Company

控制臺(tái)程序:

class Program
    {
        static void Main(string[] args)
        {
            company c = new company("北京能力有限公司");
            c.employee[0] = new person("張三");
            c.employee[1] = new person("李四");
            c.employee[2] = new person("王二");
            c.run();
            c.stop();
            Console.Read();
        }
    }

Program

輸出:

1.png

對(duì)應(yīng)的類(lèi)圖:
2.png

二元關(guān)聯(lián)

概念:兩個(gè)類(lèi)之間的關(guān)聯(lián)成為二元關(guān)聯(lián)能颁。

符號(hào):

3.png

比如:在一個(gè)大公司里杂瘸,公司總裁只認(rèn)識(shí)那些核心職員,不認(rèn)識(shí)所有的普通職員劲装,而所有的職員都認(rèn)識(shí)總裁胧沫。

public class 大公司總裁 
 { 
       private 核心職員    A; 
 } 
 
 public class 核心職員 
 { 
       private 大公司總裁  B; 
 } 
 
 public class 普通職員 
 { 
       private 大公司總裁   B; 
 }

對(duì)應(yīng)的類(lèi)圖:

4.png

單向關(guān)聯(lián)關(guān)系對(duì)應(yīng)的代碼:

public class A
{
      private B b;
}

public class B
{
}

雙向關(guān)聯(lián)關(guān)系對(duì)應(yīng)的代碼:

public class A
{
      private B b;
}

public class B
{ 
      private A a;
}

關(guān)聯(lián)的名稱(chēng)

5.png

關(guān)聯(lián)的名稱(chēng)表達(dá)了關(guān)聯(lián)的內(nèi)容,一般使用動(dòng)賓結(jié)構(gòu)的短語(yǔ)占业。(例如上面的類(lèi)圖中:work)

關(guān)聯(lián)命名的原則是該命名是否有助于理解該模型绒怨。

關(guān)聯(lián)的角色

關(guān)聯(lián)中的角色是類(lèi)的對(duì)象在關(guān)聯(lián)中所扮演的角色。例如上圖中的:employer(雇傭方)谦疾,employee(員工:受雇傭的人)南蹂。關(guān)聯(lián)的角色會(huì)轉(zhuǎn)換為代碼。

class company
    {
        public string name;     //公司名稱(chēng)
        public person[ ] employee = new person[3]; 
     
        public company(string cName)  //構(gòu)造函數(shù)
        {
            name = cName;
        }
       ……
    }

關(guān)聯(lián)的可見(jiàn)性

用可見(jiàn)性修飾角色名稱(chēng)念恍,以說(shuō)明角色名稱(chēng)可以在哪些范圍內(nèi)可被訪問(wèn)到六剥。

6.png

代碼:

class company
    {
        public string name;     //公司名稱(chēng)
           // "+"
        public person[] employee = new person[3]; 
     
        public company(string cName)  //構(gòu)造函數(shù)
        {
            name = cName;
        }
       ……
    }

關(guān)聯(lián)的多重性

多重性是指有多少個(gè)對(duì)象參與了關(guān)聯(lián)。具體的說(shuō)峰伙,是指類(lèi)A的一個(gè)對(duì)象對(duì)應(yīng)類(lèi)B的對(duì)象的個(gè)數(shù)疗疟。

舉個(gè)例子說(shuō)明吧:

7.png

對(duì)應(yīng)代碼:

public class 狗 
{ 
  private 腿[] X = new 腿[4]; 
} 
 
public class 腿 
{ 
  ……
}

(就是上面的數(shù)字描述)
多重性有哪些表示?

1: 表示1個(gè)
0..: 表示任意多個(gè)( ≥0)(可以換成n)

: 表示任意多個(gè)( ≥0)
1..
: 表示1個(gè)或多個(gè)(≥1)
0..1: 表示0個(gè)或1個(gè)
5..11: 表示5-11個(gè)
1瞳氓,3策彤,8: 表示個(gè)1或3個(gè)或8個(gè)
0,3..8: 表示0個(gè)或3-8個(gè)

聚合與組合

聚合(聚集)與組合(合成匣摘、組成)是兩種特殊的關(guān)聯(lián)店诗。

1、聚合(關(guān)聯(lián)的特例)

聚合的概念:聚合表示類(lèi)之間的整體與部分的關(guān)系音榜。聚合意味著一個(gè)類(lèi)擁有但共享另一個(gè)類(lèi)的對(duì)象庞瘸。

程序演示:聚合(code/associationB)

class cpu
    {
        public string name; //品牌
        public string rate; //主頻

        public cpu(string cpuName,string cpuRate)
        {
            name = cpuName;
            rate = cpuRate;
        }
    }
class computer
    {
        public string buyTime;
        public string color;
        public cpu mycpu;

        public computer(string computerBuyTime,string computerColor)
        {
            buyTime = computerBuyTime;
            color = computerColor;
        }
        public void cpuInfo()
        {
            Console.WriteLine("該電腦的CPU品牌為:{0}",mycpu.name);
            Console.WriteLine("該電腦的CPU主頻為:{0}", mycpu.rate);
        }
    }
class Program
    {
        static void Main(string[ ] args)
        {
            cpu cpuA = new cpu("Intel","2.93");
            cpu cpuB = new cpu("AMD","2.61");

            computer computerC = new computer("2008-9-1","黑色");
            Console.WriteLine("購(gòu)買(mǎi)時(shí)間為:{0}", computerC.buyTime);
            Console.WriteLine("顏色為:{0}\n", computerC.color);

            Console.WriteLine("現(xiàn)在安裝第一塊CPU");
            computerC.mycpu = cpuA;  //將cpuA裝入該電腦中
            computerC.cpuInfo();

            Console.WriteLine("\n現(xiàn)在安裝第二塊CPU");
            computerC.mycpu = cpuB;  //將cpuA裝入該電腦中
            computerC.cpuInfo();
        }
    }

聚合的符號(hào)
在整體類(lèi)端加空心菱形。

\color{red}{當(dāng)整體類(lèi)不存在時(shí)赠叼,不分類(lèi)仍可能存在擦囊。部分類(lèi)銷(xiāo)毀時(shí)违霞,整體類(lèi)也將能夠存在。}

關(guān)聯(lián)關(guān)系和聚合關(guān)系在語(yǔ)法上是沒(méi)辦法區(qū)分的瞬场,得從語(yǔ)義上才能更好的區(qū)分兩者的區(qū)別葛家。

2、組成

組成的概念:組成是一種特殊形式的聚合泌类。

與聚合相比,它有兩個(gè)特點(diǎn):

一個(gè)部分類(lèi)最多只能屬于一個(gè)整體類(lèi)
\color{red}{當(dāng)整體類(lèi)不存在時(shí)底燎,部分類(lèi)將同時(shí)被銷(xiāo)毀刃榨。}
最容易理解的一個(gè)例子就是窗體和文本框,當(dāng)窗體不存在時(shí)双仍,文本框也將不存在枢希。

9.png

組成的符號(hào):

在整體類(lèi)端加實(shí)心菱形。如圖:

1.png

聚合與組成的區(qū)別

2.png

關(guān)聯(lián)與聚合(包括組合)的區(qū)別

關(guān)聯(lián)關(guān)系所涉及的兩個(gè)類(lèi)是處于同一個(gè)層次上的朱沃。比如學(xué)生和課程就是一種關(guān)聯(lián)關(guān)系苞轿,而不是聚合關(guān)系,因?yàn)閷W(xué)生不是有課程組成的逗物。

聚合關(guān)系涉及的兩個(gè)類(lèi)處于不平等的層次上搬卒,一個(gè)代表整體,一個(gè)代表部分翎卓。比如電腦和顯示器契邀、鍵盤(pán)、主板失暴、內(nèi)存就是聚合關(guān)系坯门,因?yàn)橹靼迨请娔X的組成部分。而鍵盤(pán)等部件不會(huì)因?yàn)殡娔X沒(méi)了逗扒,就不存在了古戴。

聚合與組合的區(qū)別:

組合:整體類(lèi)端的重?cái)?shù)必須是1,部分類(lèi)的重?cái)?shù)是任意的矩肩。

聚合:整體類(lèi)端的重?cái)?shù)可以大于1现恼,部分類(lèi)的重?cái)?shù)是任意的备韧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末州叠,一起剝皮案震驚了整個(gè)濱河市萧诫,隨后出現(xiàn)的幾起案子圈盔,更是在濱河造成了極大的恐慌了袁,老刑警劉巖酌儒,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轧叽,死亡現(xiàn)場(chǎng)離奇詭異罗洗,居然都是意外死亡肛跌,警方通過(guò)查閱死者的電腦和手機(jī)艺配,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)察郁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人转唉,你說(shuō)我怎么就攤上這事皮钠。” “怎么了赠法?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵麦轰,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我砖织,道長(zhǎng)款侵,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任侧纯,我火速辦了婚禮新锈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘眶熬。我一直安慰自己妹笆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布娜氏。 她就那樣靜靜地躺著拳缠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪牍白。 梳的紋絲不亂的頭發(fā)上脊凰,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音茂腥,去河邊找鬼狸涌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛最岗,可吹牛的內(nèi)容都是我干的帕胆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼般渡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼懒豹!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起驯用,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤脸秽,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后蝴乔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體记餐,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年薇正,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了片酝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片囚衔。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖雕沿,靈堂內(nèi)的尸體忽然破棺而出练湿,到底是詐尸還是另有隱情,我是刑警寧澤审轮,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布肥哎,位于F島的核電站,受9級(jí)特大地震影響疾渣,放射性物質(zhì)發(fā)生泄漏贤姆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一稳衬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧坐漏,春花似錦薄疚、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至躏筏,卻和暖如春板丽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背趁尼。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工埃碱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人酥泞。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓砚殿,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親芝囤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子似炎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容