1. 程式人生 > 實用技巧 >組合/聚合複用原則CARP

組合/聚合複用原則CARP

組合/聚合複用原則(Composite/Aggregate Reuse Principle)是面向物件設計原則的一種,也叫合成複用原則。組合/聚合複用原則是指儘量使用組合/聚合,不要使用類繼承。在一個新的物件裡面使用一些已有的物件,使之成為新物件的一部分,新物件通過向這些物件的委派達到複用已有功能的目的。就是說要儘量的使用合成和聚合,而不是繼承關係達到複用的目的。

組合/聚合複用原則是什麼

  • 儘量採用組合(contains-a)、聚合(has-a)的方式而不是繼承(is-a)的關係來達到軟體的複用目的

    組合/聚合複用原則是通過將已有的物件納入新物件中,作為新物件的成員物件來實現的,新物件可以呼叫已有物件的功能,從而達到複用。 原則是儘量首先使用合成 / 聚合的方式,而不是使用繼承。

合成和聚合都是關聯的特殊種類。合成是值的聚合(Aggregation by Value),而複合是引用的聚合(Aggregation by Reference)。

都知道,類之間有三種基本關係,分別是:關聯(聚合和組合)、泛化(與繼承同一概念)、依賴。

這裡我們提一下關聯關係,客觀來講,大千世界中的兩個實體之間總是有著千絲萬縷的關係,歸納到軟體系統中就是兩個類之間必然存在關聯關係。如果一個類單向依賴另一個類,那麼它們之間就是單向關聯。如果彼此依賴,則為相互依賴,即雙向關聯。

關聯關係包括兩種特例:聚合和組合。聚合,用來表示整體與部分的關係或者 “擁有” 關係。其中,代表部分的物件可能會被代表多個整體的物件所擁有,但是並不一定會隨著整體物件的銷燬而銷燬,部分的生命週期可能會超越整體。好比班級和學生,班級銷燬或解散後學生還是存在的,學生可以繼續存在某個培訓機構或步入社會,生命週期不同於班級甚至大於班級。

合成,用來表示一種強得多的 “擁有” 關係。其中,部分和整體的生命週期是一致的,一個合成的新的物件完全擁有對其組成部分的支配權,包括建立和泯滅。好比人的各個器官組成人一樣,一旦某個器官衰竭,人也不復存在,這是一種 “強” 關聯。

如上圖所示,Heart 和 Student、Teacher 都是一種 “強” 關聯,人不能擺脫心臟而存在,即組合關係,而 Student 和 Class、School 是一種 “弱” 關聯,脫離了學校、班級,學生還能屬於社會或其他團體,即聚合關係。

組合/聚合複用原則好處

  • 可以降低類與類之間的耦合程度
  • 提高了系統的靈活性

組合/聚合複用原則例子

 1 public
class Person { 2 public void talk(String name) { 3 System.out.println(name + " say hello"); 4 } 5 public void walk(String name) { 6 System.out.println(name + " move"); 7 } 8 } 9 10 public class Manager extends Person { 11 } 12 13 public class Employee extends Person { 14 }

根據組合/聚合複用原則大家需要首選組合,然後才能是繼承,使用繼承時需要嚴格的遵守里氏替換原則,務必滿足“Is-A”的關係是才可以使用繼承,而組合卻是一種“Has-A”的關係。

由上面的程式碼能夠看出,Manager和Employee繼承了Person,但實際上每一個不同的職位具有不同的角色,如果大家填加了角色這個類,那麼繼續使用繼承的話只能使每個人只能具有一種角色,這顯然是不科學的。

轉載 https://geek-docs.com/design-pattern/design-principle/composite-aggregate-reuse-principle.html