1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        圖文并茂,詳細講解UML類圖符號、各種關系說明以及舉例

        共 4434字,需瀏覽 9分鐘

         ·

        2020-09-28 21:47

        點擊上方藍色“程序猿DD”,選擇“設為星標”

        回復“資源”獲取獨家整理的學習資料!

        作者 |?duanxz

        來源 |?https://www.cnblogs.com/duanxz

        UML中描述對象和類之間相互關系的方式包括:依賴(Dependency),關聯(lián)(Association),聚合(Aggregation),組合(Composition),泛化(Generalization),實現(xiàn)(Realization)等。

        • 依賴(Dependency):元素A的變化會影響元素B,但反之不成立,那么B和A的關系是依賴關系,B依賴A;類屬關系和實現(xiàn)關系在語義上講也是依賴關系,但由于其有更特殊的用途,所以被單獨描述。uml中用帶箭頭的虛線表示Dependency關系,箭頭指向被依賴元素。
        • 泛化(Generalization):通常所說的繼承(特殊個體 is kind of 一般個體)關系,不必多解釋了。uml中用帶空心箭頭的實線線表示Generalization關系,箭頭指向一般個體。
        • 實現(xiàn)(Realize):元素A定義一個約定,元素B實現(xiàn)這個約定,則B和A的關系是Realize,B realize A。這個關系最常用于接口。uml中用空心箭頭和虛線表示Realize關系,箭頭指向定義約定的元素。
        • 關聯(lián)(Association):元素間的結構化關系,是一種弱關系,被關聯(lián)的元素間通??梢员华毩⒌目紤]。uml中用實線表示Association關系,箭頭指向被依賴元素。
        • 聚合(Aggregation):關聯(lián)關系的一種特例,表示部分和整體(整體 has a 部分)的關系。uml中用帶空心菱形頭的實線表示Aggregation關系,菱形頭指向整體。
        • 組合(Composition):組合是聚合關系的變種,表示元素間更強的組合關系。如果是組合關系,如果整體被破壞則個體一定會被破壞,而聚合的個體則可能是被多個整體所共享的,不一定會隨著某個整體的破壞而被破壞。uml中用帶實心菱形頭的實線表示Composition關系,菱形頭指向整體。

        1.1.1 ? ? ? 依賴(Dependency):虛線箭頭表示

        • 依賴關系也是類與類之間的聯(lián)結
        • 依賴總是單向的。(#add 注意,要避免雙向依賴。一般來說,不應該存在雙向依賴。)
        • 依賴關系在 Java 或 C++ 語言中體現(xiàn)為局部變量、方法的參數(shù)或者對靜態(tài)方法的調用。

        (軟件開發(fā)中,往往會設計一些公用類,供別的類調用,如果這些公用類出問題了,那調用這些公用類的類都會因此而出問題。

        兩個元素之間的一種關系,其中一個元素(提供者)的變化將影響另一個元素(客體),或向它提供所需信息顯示一個類引用另一個類)

        方法參數(shù)示例:

        public?class?Person
        {
        ????void?buy(Car?car)
        ???
        {
        ???????...
        ????}
        }

        表示方法:虛線加箭頭

        特點:當類與類之間有使用關系時就屬于依賴關系,不同于關聯(lián)關系,依賴不具有“擁有關系”,而是一種“相識關系”,只在某個特定地方(比如某個方法體內)才有關系。

        依賴關系可以分為以下四類:

        1) ?使用依賴(Usage)表示客戶使用提供者提供的服務以實現(xiàn)它的行為,包括:

        • 使用<>--聲明使用一個類時需要用到已存在的另一個類。
        • 調用<>--聲明一個類調用其他類的操作的方法。
        • 參數(shù)<>--聲明一個操作和它的參數(shù)之間的關系。
        • 發(fā)送<>--聲明信號發(fā)送者和信號接收者之間的關系。
        • 實例化<>--聲明用一個類的方法創(chuàng)建了另一個類的實例。

        2) ?抽象依賴(Abstraction)表示客戶與提供者之間用不同的方法表現(xiàn)同一個概念,通常一個概念更抽象,一個概念更具體。包括:

        • 跟蹤<>--聲明不同模型中的元素之間存在一些連接但不如映射精確。
        • 精化<>--聲明具有兩個不同語義層次上的元素之間的映射。
        • 派生<>--聲明一個實例可以從另一個實例導出。

        3) ?授權依賴(Permission)表達提供者為客戶提供某種權限以訪問其內容的情形。包括:

        • 訪問<>--允許一個包訪問另一個包的內容。
        • 導入<>--允許一個包訪問另一個包的內容并為被訪問包的組成部分增加別名。
        • 友元<>--允許一個元素訪問另一個元素,不管被訪問的元素是否具有可見性。

        4) ?綁定依賴(Binding)較高級的依賴類型,用于綁定模板以創(chuàng)建新的模型元素,包括:

        • 綁定<>--為模板參數(shù)指定值,以生成一個新的模型元素。

        1.1.2 ? ? ? 關聯(lián)(Association):實線箭頭表示

        • 關聯(lián)關系是類與類之間的聯(lián)結,它使一個類知道另一個類的屬性和方法。
        • 關聯(lián)可以是雙向的,也可以是單向的(#add還有自身關聯(lián))。雙向的關聯(lián)可以有兩個箭頭或者沒有箭頭,單向的關聯(lián)有一個箭頭。
        • 在 Java 或 c++ 中,關聯(lián)關系是通過使用成員變量來實現(xiàn)的。
        public?class?徒弟
        {??

        }

        public?class?唐僧
        {
        ?????protected:?list<徒弟>?tdlist;
        }

        表示方法:實線箭頭

        特征:表示類與類或類與接口之間的依賴關系,表現(xiàn)為“擁有關系”;具體到代碼可以用實例變量來表示。(A類有一個成員變量保存的是B類的一個引用,也就是說由A類可以找到B類)

        1.1.3 ? ? ? 聚合(Aggregation):帶空心菱形頭表示

        • 聚合關系是關聯(lián)關系的一種,是強的關聯(lián)關系。
        • 聚合是整體和部分之間的關系,例如汽車由引擎、輪胎以及其它零件組成。
        • 聚合關系也是通過成員變量來實現(xiàn)的。但是,關聯(lián)關系所涉及的兩個類處在同一個層次上,而聚合關系中,兩個類處于不同的層次上,一個代表整體,一個代表部分。
        • 關聯(lián)與聚合僅僅從 Java 或 C++ 語法上是無法分辨的,必須考察所涉及的類之間的邏輯關系。
        public?class?引擎
        ?
        {

        ?}
        public?class?輪胎
        ?
        {

        ?}
        public?class?汽車
        {
        ????????protected:引擎?engine;
        ????????protected:輪胎?tyre[4];
        }

        表示方法:空心菱形頭

        特征:屬于是關聯(lián)的特殊情況,體現(xiàn)部分-整體關系,是一種弱擁有關系;整體和部分可以有不一樣的生命周期;是一種弱關聯(lián);

        1.1.4 ? ? ? 組合(Composition):帶實心菱形頭的實線表示

        • 合成關系是關聯(lián)關系的一種,是比聚合關系還要強的關系。
        • 它要求普通的聚合關系中代表整體的對象負責代表部分的對象的生命周期。
        class?肢
        ?
        {
        ?}
        ?class?人
        ?
        {
        ????????protected:??肢???limb[4];
        ?}

        表示方法:一般是實心菱形加實線箭頭表示

        特征:屬于是關聯(lián)的特殊情況,也體現(xiàn)了體現(xiàn)部分-整體關系,是一種強“擁有關系”;整體與部分有相同的生命周期,是一種強關聯(lián);

        1.1.5 ? ? ? 泛化(Generalization):

        帶空心箭頭的實線線表示

        泛化(下圖)表示一個更泛化的元素和一個更具體的元素之間的關系。泛化是用于對繼承進行建模的UML元素。在Java中,用extends關鍵字來直接表示這種關系。

        泛化關系表示類與類之間的繼承關系,接口與接口之間的繼承關系。如下圖:

        1.1.6 ? ? ? 實現(xiàn)(Realization):空心箭頭和虛線表示

        實例(圖I)關系指定兩個實體之間的一個合同。換言之,一個實體定義一個合同,而另一個實體保證履行該合同。對Java應用程序進行建模時,實現(xiàn)關系可直接用implements關鍵字來表示。表達一種說明元素與實現(xiàn)元素之間的關系;

        圖一

        二、相互之間的區(qū)別

        1.聚合與組合

        (1)聚合與組合都是一種結合關系,只是額外具有整體-部分的意涵。

        (2)部件的生命周期不同

        聚合關系中,整件不會擁有部件的生命周期,所以整件刪除時,部件不會被刪除。再者,多個整件可以共享同一個部件。

        組合關系中,整件擁有部件的生命周期,所以整件刪除時,部件一定會跟著刪除。而且,多個整件不可以同時間共享同一個部件。

        (3)聚合關系是“has-a”關系,組合關系是“contains-a”關系。

        • “弱”包含表示如果部門沒有了,員工也可以繼續(xù)存在;
        • “強”包含表示如果部門沒有了,員工也不再存在;

        在做軟件需求時,往往會將所有的包含關系畫成“弱”包含,后面發(fā)現(xiàn)某些關系可以表示為“強”包含是,才轉為實心菱形。

        2.關聯(lián)和聚合

        (1)表現(xiàn)在代碼層面,和關聯(lián)關系是一致的,只能從語義級別來區(qū)分。

        (2)關聯(lián)和聚合的區(qū)別主要在語義上,關聯(lián)的兩個對象之間一般是平等的,例如你是我的朋友,聚合則一般不是平等的。

        (3)關聯(lián)是一種結構化的關系,指一種對象和另一種對象有聯(lián)系。

        (4)關聯(lián)和聚合是視問題域而定的,例如在關心汽車的領域里,輪胎是一定要組合在汽車類中的,因為它離開了汽車就沒有意義了。但是在賣輪胎的店鋪業(yè)務里,就算輪胎離開了汽車,它也是有意義的,這就可以用聚合了。

        3.關聯(lián)和依賴

        (1)關聯(lián)關系中,體現(xiàn)的是兩個類、或者類與接口之間語義級別的一種強依賴關系,比如我和我的朋友;這種關系比依賴更強、不存在依賴關系的偶然性、關系也不是臨時性的,一般是長期性的,而且雙方的關系一般是平等的。

        (2)依賴關系中,可以簡單的理解,就是一個類A使用到了另一個類B,而這種使用關系是具有偶然性的、臨時性的、非常弱的,但是B類的變化會影響到A。

        4.泛化和實現(xiàn)

        實現(xiàn)表示類對接口的實現(xiàn)關系,表示方式:用一條帶有空心三角箭頭的虛線指向接口。

        泛化表示類與類之間的繼承關系、接口與接口之間的繼承關系,表示方式一條帶有空心三角箭頭的實線指向基類(父接口)。

        5.綜合比較

        這幾種關系都是語義級別的,所以從代碼層面并不能完全區(qū)分各種關系;但總的來說,后幾種關系所表現(xiàn)的強弱程度依次為:

        組合>聚合>關聯(lián)>依賴

        其中依賴(Dependency)的關系最弱,而關聯(lián)(Association),聚合(Aggregation),組合(Composition)表示的關系依次增強。換言之關聯(lián),聚合,組合都是依賴關系的一種,聚合是表明對象之間的整體與部分關系的關聯(lián),而組合是表明整體與部分之間有相同生命周期關系的聚合。

        而關聯(lián)與依賴的關系用一句話概括下來就是,依賴描述了對象之間的調用關系,而關聯(lián)描述了對象之間的結構關系。


        往期推薦

        這樣配置,讓你的 IDEA 好用到飛起來!

        頭條二面:宕機后,Redis如何實現(xiàn)快速恢復?

        全國首例!某度起訴“文庫下載神器”,索賠300萬

        推薦一款免費的數(shù)據(jù)庫管理工具,功能很強大

        陌陌開源合規(guī)審計平臺 Bombus

        盤點 Github 上的高仿 app 項目


        專注于「開發(fā)者」綜合成長的深度星球
        限時優(yōu)惠進行中
        熱門內容回顧
        - 技術人0716期:為什么架構師大多是后端出生?
        -?社會人0926期:分享下我的業(yè)余生活:長期收益的合作
        瀏覽 33
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            欧美黄片毛 | 97爽无码人妻aⅴ精品牛牛 | 大骚屄网| 日本丶国产丶欧美色综合 | 一区二区三区免费看 | 操操操综合 | 日韩精品免费无码视频 | 快操我视频 | 国产激情乱伦 | 麻豆精品一区二区三区的成功之道 |