• <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小結

            在UML類圖中,類與類之間有幾種常見關系:依賴、關聯、聚合、組合、泛化。

            1、依賴(Dependency)


            依賴是一種很有用的關系,它用來表述一個類A“use”了另一個類B。A可以是通過任何方式“use”類B,如:

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

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

            3)A的成員函數的內部實現使用了B;

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

            image

            在C++代碼中,依賴關系是這樣對應的:

            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、關聯(Association)

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

            關聯可以分為雙向關聯、單向關聯、自身關聯。

            1)雙向關聯

            雙向關聯A-B:雙方都“知道”對方,都可以調用對方的公共屬性和方法。

            image

            對應的C++代碼為:

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

            2)單向關聯

            單向關聯A->B:表示A“知道”B,A可以調用B的公共屬性和方法。沒有生命周期的依賴。

            image

            對應的C++代碼為:

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

            3)自身關聯

            自身關聯:自己引用自己,這個在鏈表中非常常見。

            可以看到,上面的Object類,就是一個自身關聯的應用,它有一個自己指向自己的指針,用來實現鏈表。

            image

            對應的C++代碼為:

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

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

            聚合和組合都是用在表述整體-部分關系的時候,二者只是在生命周期問題上有差異。

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

            image

            對應的C++代碼:

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

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

            image

            對應的C++代碼:

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

            可以發現,如果單純從C++代碼來看,聚合關系和組合關系沒有什么不同,要區分聚合和組合,只能從語義分析。

            補充:

            組合關系還有另一層含義:“is a”。不過這種含義,僅僅用來角色方面,即“is a”角色。比如一個人,是丈夫角色。那也可以看做組合;手機可以看做“Camera”、“Music Player”等。

            image

            從上圖我們可以看出,Battery和Smart Phone是聚合關系,因為電池是手機的一部分,但是電池可以脫離手機而存在。而IMEI Number和Smart Phone是組合關系,一般情況下一個Smart Phone只有一個IMEI Number,手機消失后,IMEI跟著消失。而我們知道現在的手機可以拍照、上網、播放音樂,因此手機可以扮演相機、web沖浪、音樂播放器的角色,所以Smart phone和Camera、Web Browser、Music Player是組合的關系。

            4、泛化(Realization)

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

            image

            對應的C++代碼為:

            class Car {
            
            };
            
            class Police_Car{
            
            };
            

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

            <2012年11月>
            28293031123
            45678910
            11121314151617
            18192021222324
            2526272829301
            2345678

            導航

            統計

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            博客友

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            漂亮人妻被黑人久久精品| 日本高清无卡码一区二区久久| 欧美久久久久久| 久久精品毛片免费观看| 亚洲乱亚洲乱淫久久| 亚洲伊人久久成综合人影院 | 国产欧美一区二区久久| 狠狠色丁香婷婷综合久久来| 久久人人爽人人爽人人片AV麻豆| 久久精品三级视频| 久久国产亚洲高清观看| 久久99精品久久久久久9蜜桃| 波多野结衣久久精品| 99久久超碰中文字幕伊人| 武侠古典久久婷婷狼人伊人| 色婷婷综合久久久久中文一区二区 | 久久精品国产亚洲网站| 欧美精品丝袜久久久中文字幕 | 精品久久久久久久久久久久久久久 | 人妻精品久久久久中文字幕| 久久精品国产亚洲AV香蕉| 久久久艹| 久久综合久久综合久久综合| 久久精品桃花综合| 日韩精品无码久久一区二区三| 久久99精品国产一区二区三区| 久久精品国产99久久久古代| 久久综合久久鬼色| 久久精品国产99国产电影网| 亚洲中文字幕无码久久2020 | 久久久久亚洲AV片无码下载蜜桃| 欧美激情精品久久久久久久| 国产成人精品综合久久久| 99久久成人国产精品免费| 久久亚洲AV成人无码国产| 无码超乳爆乳中文字幕久久| 蜜桃麻豆WWW久久囤产精品| 香蕉久久永久视频| 国产精品久久久久久久久久影院| 日韩电影久久久被窝网| 亚洲天堂久久久|