• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            lynch

            C++ UML小結(jié)

            在UML類圖中,類與類之間有幾種常見(jiàn)關(guān)系:依賴、關(guān)聯(lián)、聚合、組合、泛化。

            1、依賴(Dependency)


            依賴是一種很有用的關(guān)系,它用來(lái)表述一個(gè)類A“use”了另一個(gè)類B。A可以是通過(guò)任何方式“use”類B,如:

            1)A的成員函數(shù)的返回值為B;

            2)A的成員函數(shù)使用B作為函數(shù)參數(shù);

            3)A的成員函數(shù)的內(nèi)部實(shí)現(xiàn)使用了B;

            依賴關(guān)系通常使用虛線箭頭“---->”表示,箭頭指向被“use”的類。

            image

            在C++代碼中,依賴關(guān)系是這樣對(duì)應(yīng)的:

            class A
            
            { public: B returns_a_B();
            
            void has_a_B_argument(B);
            
            void has_a_B_in_its_implementation();
            
            };
            
            A::void has_a_B_in_its_implementation(){ B b; }
            

            2、關(guān)聯(lián)(Association)

            關(guān)聯(lián)可以表述成一個(gè)類“知道”另一個(gè)類。如何“知道”呢?在C++中,類A“知道”類B一般是通過(guò)指針實(shí)現(xiàn)的(也可以使用引用或者值),即類A有一個(gè)成員變量是指向B的指針(或者引用、值)。

            關(guān)聯(lián)可以分為雙向關(guān)聯(lián)、單向關(guān)聯(lián)、自身關(guān)聯(lián)。

            1)雙向關(guān)聯(lián)

            雙向關(guān)聯(lián)A-B:雙方都“知道”對(duì)方,都可以調(diào)用對(duì)方的公共屬性和方法。

            image

            對(duì)應(yīng)的C++代碼為:

            class A {
            
            public:
            
            B* pB;
            
            };
            
            class B {
            
            public:
            
            A* pA;
            
            };
            

            2)單向關(guān)聯(lián)

            單向關(guān)聯(lián)A->B:表示A“知道”B,A可以調(diào)用B的公共屬性和方法。沒(méi)有生命周期的依賴。

            image

            對(duì)應(yīng)的C++代碼為:

            class A {
            
            public:
            
            B* pB;
            
            };
            
            class B {
            
            };
            

            3)自身關(guān)聯(lián)

            自身關(guān)聯(lián):自己引用自己,這個(gè)在鏈表中非常常見(jiàn)。

            可以看到,上面的Object類,就是一個(gè)自身關(guān)聯(lián)的應(yīng)用,它有一個(gè)自己指向自己的指針,用來(lái)實(shí)現(xiàn)鏈表。

            image

            對(duì)應(yīng)的C++代碼為:

            class Object {
            
            public:
            
            int data;
            
            Object* next;
            
            };
            
            class ObjectList {
            
            public:
            
            Object* first;
            
            ObjectList();
            
            void insert(Object* obj);
            
            void print() const;
            
            };
            

            3、聚合(Aggregation)和組合(Composition)

            聚合和組合都是用在表述整體-部分關(guān)系的時(shí)候,二者只是在生命周期問(wèn)題上有差異。

            1)聚合通常可以理解成“has a”關(guān)系。如果類A聚合類B,那么類A“has a”類B,同時(shí),在A的生命周期結(jié)束后類B必須依然存在或者有意義。比如房間有一張桌子,那么房間和桌子的關(guān)系就是聚合:即使房間沒(méi)有了,那張桌子還是存在的,桌子是可以脫離房間而存在的。

            image

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

            class Table {
            
            };
            
            class Room {
            
            public:
            
            Table aTable;
            
            };
            

            2)組合通常可以理解為“is a part of”。和聚合不同的是,如果類A組合類B,那么當(dāng)A生命周期結(jié)束后,類B也隨之結(jié)束,也就是說(shuō)B不能脫離類A而存在。就如同鳥(niǎo)都有兩只翅膀一樣,當(dāng)鳥(niǎo)消失了,翅膀也隨之不存在了。

            image

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

            class Wing {
            
            };
            
            class Bird{
            
            public:
            
            Wing leftWing;
            
            Wing rightWing;
            
            };
            

            可以發(fā)現(xiàn),如果單純從C++代碼來(lái)看,聚合關(guān)系和組合關(guān)系沒(méi)有什么不同,要區(qū)分聚合和組合,只能從語(yǔ)義分析。

            補(bǔ)充:

            組合關(guān)系還有另一層含義:“is a”。不過(guò)這種含義,僅僅用來(lái)角色方面,即“is a”角色。比如一個(gè)人,是丈夫角色。那也可以看做組合;手機(jī)可以看做“Camera”、“Music Player”等。

            image

            從上圖我們可以看出,Battery和Smart Phone是聚合關(guān)系,因?yàn)殡姵厥鞘謾C(jī)的一部分,但是電池可以脫離手機(jī)而存在。而IMEI Number和Smart Phone是組合關(guān)系,一般情況下一個(gè)Smart Phone只有一個(gè)IMEI Number,手機(jī)消失后,IMEI跟著消失。而我們知道現(xiàn)在的手機(jī)可以拍照、上網(wǎng)、播放音樂(lè),因此手機(jī)可以扮演相機(jī)、web沖浪、音樂(lè)播放器的角色,所以Smart phone和Camera、Web Browser、Music Player是組合的關(guān)系。

            4、泛化(Realization)

            泛化關(guān)系也被常用作繼承(inherit)關(guān)系,是用來(lái)表述“Is-a”這種關(guān)系的,比如Car和Police-Car的關(guān)系,Police-Car “is a” Car。

            image

            對(duì)應(yīng)的C++代碼為:

            class Car {
            
            };
            
            class Police_Car{
            
            };
            

            posted on 2012-12-21 22:09 董三 閱讀(1653) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++

            <2012年12月>
            2526272829301
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            博客友

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久热这里只有精品在线观看| 久久男人Av资源网站无码软件| 亚洲午夜精品久久久久久人妖| 亚洲一本综合久久| 伊人久久大香线蕉综合网站| 久久人人爽人人爽人人片AV不 | 99久久www免费人成精品| 久久影视综合亚洲| 久久w5ww成w人免费| 久久久久国产精品麻豆AR影院| 亚洲日韩中文无码久久| 国内精品久久久久久久影视麻豆| 精品久久久无码21p发布 | 久久99精品国产麻豆蜜芽| 精品久久久中文字幕人妻| 欧美国产精品久久高清| 久久精品国产影库免费看| 国产成人无码精品久久久性色| 久久国产精品国语对白| 国产精品久久毛片完整版| 天天躁日日躁狠狠久久| 香蕉久久永久视频| 久久本道综合久久伊人| 久久国产美女免费观看精品| 99精品久久精品| 久久中文骚妇内射| 午夜天堂av天堂久久久| 精品久久久无码21p发布| 国产A三级久久精品| 久久久亚洲AV波多野结衣 | 性高朝久久久久久久久久| 久久久久久狠狠丁香| 97久久综合精品久久久综合| 亚洲精品美女久久777777| 欧美综合天天夜夜久久| 18岁日韩内射颜射午夜久久成人| 99久久成人18免费网站| 日本久久久精品中文字幕| 久久久91精品国产一区二区三区| 人妻精品久久久久中文字幕69| 少妇久久久久久久久久|