类之间的关系
類間關系
? ? ? ? ? ? ? ?在類圖中,除了需要描述單獨的類的名稱、屬性和操作外,我們還需要描述類之間的聯(lián)系,因為沒有類是單獨存在的,它們通常需要和別的類協(xié)作,創(chuàng)造比單獨工作更大的語義。在UML類圖中,關系用類框之間的連線來表示,連線上和連線端頭處的不同修飾符表示不同的關系。類之間的關系有繼承(泛化)、關聯(lián)、依賴、聚合和組合。
?
1.泛化(Generalization)
[泛化]
表示類與類之間的繼承關系,接口與接口之間的繼承關系,或類對接口的實現(xiàn)關系。
?[具體表現(xiàn)]
父類?父類實例=new?子類()
[UML圖](圖1.1)
?
圖1.1 Animal類與Tiger類,Dog類的泛化關系
[代碼表現(xiàn)]
1.class?Animal{} ??
2.class?Tiger?extends?Animal{} ??
3.public?class?Test ??
4.{ ??
5.????public?void?test() ??
6.???? { ??
7.???????? Animal a=new?Tiger(); ??
8.???? } ??
9.}
2.依賴(Dependency)
[依賴]
對于兩個相對獨立的對象,當一個對象負責構造另一個對象的實例,或者依賴另一個對象的服務時,這兩個對象之間主要體現(xiàn)為依賴關系。
[具體表現(xiàn)]
依賴關系表現(xiàn)在局部變量,方法的參數(shù),以及對靜態(tài)方法的調用
[現(xiàn)實例子]
比如說你要去擰螺絲,你是不是要借助(也就是依賴)螺絲刀(Screwdriver)來幫助你完成擰螺絲(screw)的工作
[UML表現(xiàn)](圖1.2)
?
圖1.2 Person類與Screwdriver類的依賴關系
[代碼表現(xiàn)]
1.public?class?Person{ ??
2.????/**?擰螺絲?*/??
3.????public?void?screw(Screwdriver screwdriver){ ??
4.???????? screwdriver.screw(); ??
5.???? } ??
6.}??
3.關聯(lián)(Association)
[關聯(lián)]
對于兩個相對獨立的對象,當一個對象的實例與另一個對象的一些特定實例存在固定的對應關系時,這兩個對象之間為關聯(lián)關系。
[具體表現(xiàn)]
關聯(lián)關系是使用實例變量來實現(xiàn)
[現(xiàn)實例子]
比如客戶和訂單,每個訂單對應特定的客戶,每個客戶對應一些特定的訂單;再例如公司和員工,每個公司對應一些特定的員工,每個員工對應一特定的公司
[UML圖] (圖1.3)
?
圖1.3?公司和員工的關聯(lián)關系
[代碼表現(xiàn)]
1.public?class?Company{ ??
2.????private?Set<Employee> employee = new HashSet<>(); ??
3.????public?Employee getEmployee(){ ??
4.????????return?employee; ??
5.???? } ??
6.????public?void?setEmployee(Employee employee){ ??
7.????????this.employee=employee; ??
8.???? } ??
9.????//公司運作???
10.?????public?void?run(){ ??
11.????????? employee.startWorking(); ??
12.????? } ??
13.?}??
(4)聚合(Aggregation)
[聚合]
通常在定義一個整體類后,再去分析這個整體類的組成結構。從而找出一些組成類,該整體類和組成類之間就形成了聚合關系。例如一個航母編隊包括海空母艦、驅護艦艇、艦載飛機及核動力攻擊潛艇等。需求描述中“包含”、“組成”、“分為…部分”等詞常意味著聚合關系。
[具體表現(xiàn)]
與關聯(lián)關系一樣,聚合關系也是通過實例變量來實現(xiàn)這樣關系的。關聯(lián)關系和聚合關系在語法上是沒辦法區(qū)分的,從語義上才能更好的區(qū)分兩者的區(qū)別。
[關聯(lián)與聚合的區(qū)別]
關聯(lián)關系所涉及的兩個對象是處在同一個層次上的。比如人和自行車就是一種關聯(lián)關系,而不是聚合關系,因為人不是由自行車組成的。
聚合關系涉及的兩個對象處于不平等的層次上,一個代表整體,一個代表部分。比如電腦和它的顯示器、鍵盤、主板以及內存就是聚集關系,因為主板是電腦的組成部分。
[UML圖](圖1.4)
?
圖1.3?電腦和組件的聚合關系
[代碼表現(xiàn)]
1.public?class?Computer{ ??
2.????private?CPU cpu; ??
3.????public?CPU getCPU(){ ??
4.????????return?cpu; ??
5.???? } ??
6.????public?void?setCPU(CPU cpu){ ??
7.????????this.cpu=cpu; ??
8.???? } ??
9.????//開啟電腦???
10.?????public?void?start(){ ??
11.?????????//cpu運作???
12.????????? cpu.run(); ??
13.????? } ??
?
(5)組合(composition)
[組合]
也表示類之間整體和部分的關系,但是組合關系中部分和整體具有統(tǒng)一的生存期。一旦整體對象不存在,部分對象也將不存在。部分對象與整體對象之間具有共生死的關系。
[UML圖]
?
[聚合和組合的區(qū)別]:
聚合關系是“has-a”關系,組合關系是“contains-a”關系;聚合關系表示整體與部分的關系比較弱,而組合比較強;聚合關系中代表部分事物的對象與代表聚合事物的對象的生存期無關,一旦刪除了聚合對象不一定就刪除了代表部分事物的對象。組合中一旦刪除了組合對象,同時也就刪除了代表部分事物的對象。
我們用淺顯的例子來說明聚合和組合的區(qū)別。“國破家亡”,國滅了,家自然也沒有了,“國”和“家”顯然也是組合關系。而相反的,計算機和它的外設之間就是聚合關系,因為它們之間的關系相對松散,計算機沒了,外設還可以獨立存在,還可以接在別的計算機上。在聚合關系中,部分可以獨立于聚合而存在,部分的所有權也可以由幾個聚合來共享,比如打印機就可以在辦公室內被廣大同事共用。
在C++語言中,從實現(xiàn)的角度講,聚合可以表示為:
class A {...}
class B { A* a; .....}
即類B包含類A的指針;
而組合可表示為:
class A{...}
class B{ A a; ...}
即類B包含類A的對象。
準確的UML類圖中用空心和實心菱形對聚合和組合進行了區(qū)分。
聚合,關聯(lián),組合?是對象之間的三種關系。從某種意義上說,繼承是一種類的縱向關系,而聚合,關聯(lián),組合是對象的橫向關系。
其關系強弱為?依賴<關聯(lián)<聚合<組合
(6)實現(xiàn)(implement)
指的是一個class類實現(xiàn)interface接口(可以是多個)的功能;實現(xiàn)是類與接口之間最常見的關系;在Java中此類關系通過關鍵字implements明確標識,在設計時一般沒有爭議性;
?
?
轉載于:https://www.cnblogs.com/BruningHUA/p/6221328.html
總結
- 上一篇: 利用js刷新页面方法
- 下一篇: System进程(pid=4)占用80端