• <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>
            posts - 311, comments - 0, trackbacks - 0, articles - 0
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            在建立對(duì)象模型時(shí),很容易把依賴(lài)、關(guān)聯(lián)和聚集關(guān)系混淆。當(dāng)對(duì)象A和對(duì)象B之間存在依賴(lài)、關(guān)聯(lián)或聚集關(guān)系時(shí),對(duì)象A都有可能調(diào)用對(duì)象B的方法,這是三種關(guān)系之間的相同之處,除此之外,它們有著不同的特征。

            1.依賴(lài)關(guān)系的特征


            對(duì)于兩個(gè)相對(duì)獨(dú)立的系統(tǒng),當(dāng)一個(gè)系統(tǒng)負(fù)責(zé)構(gòu)造另一個(gè)系統(tǒng)的實(shí)例,或者依賴(lài)另一個(gè)系統(tǒng)的服務(wù)時(shí),這兩個(gè)系統(tǒng)之間主要體現(xiàn)為依賴(lài)關(guān)系,例如生產(chǎn)零件的機(jī)器和零件,機(jī)器負(fù)責(zé)構(gòu)造零件對(duì)象。再例如充電電池和充電器,充電電池通過(guò)充電器來(lái)充電。再例如自行車(chē)Bicycle和打氣筒Pump,自行車(chē)通過(guò)打氣筒來(lái)充氣。圖1-39為Bicycle類(lèi)與Pump類(lèi)的類(lèi)框圖。



            圖1-39 Bicycle類(lèi)與Pump類(lèi)的依賴(lài)關(guān)系

            Bicycle類(lèi)和Pump類(lèi)之間是依賴(lài)關(guān)系,在Bicycle類(lèi)中無(wú)需定義Pump類(lèi)型的變量。Bicycle類(lèi)的定義如下:

             

             

            public class Bicycle{
            /** 給輪胎充氣 */
            public void expand(Pump pump){
            pump.blow();
            }
            }

             


            在現(xiàn)時(shí)生活中,通常不會(huì)為某一輛自行車(chē)配備專(zhuān)門(mén)的打氣筒,而是在需要充氣的時(shí)候,從附近某個(gè)修車(chē)棚里借個(gè)打氣筒打氣。在程序代碼中,表現(xiàn)為Bicycle類(lèi)的expand()方法有個(gè)Pump類(lèi)型的參數(shù)。以下程序代碼表示某輛自行車(chē)先后到兩個(gè)修車(chē)棚里充氣:

             

            myBicycle.expand(pumpFromRepairShed1); //到第一個(gè)修車(chē)棚里充氣
            myBicycle.expand(pumpFromRepairShed2); //若干天后,到第二個(gè)修車(chē)棚里充氣


             

            2.關(guān)聯(lián)關(guān)系的特征
            對(duì)于兩個(gè)相對(duì)獨(dú)立的系統(tǒng),當(dāng)一個(gè)系統(tǒng)的實(shí)例與另一個(gè)系統(tǒng)的一些特定實(shí)例存在固定的對(duì)應(yīng)關(guān)系時(shí),這兩個(gè)系統(tǒng)之間為關(guān)聯(lián)關(guān)系。例如客戶和訂單,每個(gè)訂單對(duì)應(yīng)特定的客戶,每個(gè)客戶對(duì)應(yīng)一些特定的訂單;再例如公司和員工,每個(gè)公司對(duì)應(yīng)一些特定的員工,每個(gè)員工對(duì)應(yīng)一特定的公司;再例如自行車(chē)和主人,每輛自行車(chē)屬于特定的主人,每個(gè)主人有特定的自行車(chē),圖1-40顯示了主人和自行車(chē)的關(guān)聯(lián)關(guān)系。而充電電池和充電器之間就不存在固定的對(duì)應(yīng)關(guān)系,同樣自行車(chē)和打氣筒之間也不存在固定的對(duì)應(yīng)關(guān)系。

            圖1-40 主人和自行車(chē)的關(guān)聯(lián)關(guān)系


            Person類(lèi)與Bicycle類(lèi)之間存在關(guān)聯(lián)關(guān)系,這意味著在Person類(lèi)中需要定義一個(gè)Bicycle類(lèi)型的成員變量。以下是Person類(lèi)的定義:

             

            public class Person{
            private Bicycle bicycle; //主人的自行車(chē)

            public Bicycle getBicycle(){
            return bicycle;
            }
            public void setBicycle(Bicycle bicycle){
            this.bicycle=bicycle;
            }
            /** 騎自行車(chē)去上班 */
            public void goToWork(){
            bicycle.run();
            }
            }

             


            在現(xiàn)時(shí)生活中,當(dāng)你騎自行車(chē)去上班時(shí),只要從家里推出自己的自行車(chē)就能上路了,不象給自行車(chē)打氣那樣,在需要打氣時(shí),還要四處去找修車(chē)棚。因此,在Person類(lèi)的goToWork()方法中,調(diào)用自身的bicycle對(duì)象的run()方法。假如goToWork()方法采用以下的定義方式:

             

            /** 騎自行車(chē)去上班 */
            public void goToWork(Bicycle bicycle){
            bicycle.run();
            }


             

            那就好比去上班前,還要先四處去借一輛自行車(chē),然后才能去上班。


            3.聚集關(guān)系的特征


            當(dāng)系統(tǒng)A被加入到系統(tǒng)B中,成為系統(tǒng)B的組成部分時(shí),系統(tǒng)B和系統(tǒng)A之間為聚集關(guān)系。例如自行車(chē)和它的響鈴、龍頭、輪胎、鋼圈以及剎車(chē)裝置就是聚集關(guān)系,因?yàn)轫戔徥亲孕熊?chē)的組成部分。而人和自行車(chē)不是聚集關(guān)系,因?yàn)槿瞬皇怯勺孕熊?chē)組成的,如果一定要研究人的組成,那么他應(yīng)該由頭、軀干和四肢等組成。由此可見(jiàn),可以根據(jù)語(yǔ)義來(lái)區(qū)分關(guān)聯(lián)關(guān)系和聚集關(guān)系。

            聚集關(guān)系和關(guān)聯(lián)關(guān)系的區(qū)別還表現(xiàn)在以下方面:

            (1) 對(duì)于具有關(guān)聯(lián)關(guān)系的兩個(gè)對(duì)象,多數(shù)情況下,兩者有獨(dú)立的生命周期。比如自行車(chē)和他的主人,當(dāng)自行車(chē)不存在了,它的主人依然存在;反之亦然。但在個(gè)別情況下,一方會(huì)制約另一方的生命周期。比如客戶和訂單,當(dāng)客戶不存在,它的訂單也就失去存在的意義。

            (2) 對(duì)于具有聚集關(guān)系(尤其是強(qiáng)聚集關(guān)系)的兩個(gè)對(duì)象,整體對(duì)象會(huì)制約它的組成對(duì)象的生命周期。部分類(lèi)的對(duì)象不能單獨(dú)存在,它的生命周期依賴(lài)于整體類(lèi)的對(duì)象的生命周期,當(dāng)整體消失,部分也就隨之消失。比如小王的自行車(chē)被偷了,那么自行車(chē)的所有組件也不存在了,除非小王事先碰巧把一些可拆卸的組件(比如車(chē)鈴和坐墊)拆了下來(lái)。
            不過(guò),在用程序代碼來(lái)表示關(guān)聯(lián)關(guān)系和聚集關(guān)系時(shí),兩者比較相似。圖1-41為自行車(chē)Bicycle與響鈴Bell的聚集關(guān)系。

            圖1-41 自行車(chē)和響鈴的聚集關(guān)系

            以下例程1-6是Bicycle類(lèi)的源程序。

             

            例程1-6 Bicycle.java

            public class Bicycle{
            private Bell bell;

            public Bell getBell(){
            return bell;
            }

            public void setBell(Bell bell){
            this.bell=bell;
            }

            /** 發(fā)出鈴聲 */
            public void alert(){
            bell.ring();
            }
            }

             


            在Bicycle類(lèi)中定義了Bell類(lèi)型的成員變量,Bicycle類(lèi)利用自身的bell成員變量來(lái)發(fā)出鈴聲,這和在Person類(lèi)中定義了Bicycle類(lèi)型的成員變量,Person類(lèi)利用自身的bicycle成員變量去上班很相似。

            欧美丰满熟妇BBB久久久| 四虎影视久久久免费观看| 少妇人妻88久久中文字幕| 久久婷婷五月综合97色 | 伊人色综合久久天天网| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 人妻少妇精品久久| 久久久久亚洲AV成人片 | 久久久SS麻豆欧美国产日韩| 久久综合噜噜激激的五月天| 久久久精品日本一区二区三区| 久久久久久久久久久久久久| 韩国无遮挡三级久久| 久久综合视频网| 久久久久婷婷| 亚洲国产精久久久久久久| 亚洲综合熟女久久久30p| 日韩精品无码久久一区二区三| 国产精品99精品久久免费| 国产欧美久久久精品影院| 国产精品日韩深夜福利久久| 亚洲欧美成人综合久久久| 综合久久一区二区三区 | 香港aa三级久久三级| 国产午夜福利精品久久2021| 久久午夜免费视频| 欧美日韩精品久久久免费观看| 国产精品免费久久久久影院| 久久天天躁狠狠躁夜夜96流白浆| 伊人久久大香线蕉综合影院首页| 久久综合久久美利坚合众国| 久久国产视频99电影| 久久男人中文字幕资源站| 久久人人爽人爽人人爽av| 久久久久久一区国产精品| 久久久久国产精品麻豆AR影院| 国产亚州精品女人久久久久久| 久久精品一区二区影院| 久久露脸国产精品| 精品无码久久久久国产动漫3d| 亚洲国产成人久久综合区|