云计算百科
云计算领域专业知识百科平台

如何区分类的关系是关联和聚合?

下面我将结合Mermaid图形详细解析关联(Association)和聚合(Aggregation)的区别,通过可视化方式展示它们在UML中的表示以及代码实现的关键差异。

1. 核心概念对比

#mermaid-svg-WLorkBww2YrhlCkE {font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-WLorkBww2YrhlCkE .error-icon{fill:#552222;}#mermaid-svg-WLorkBww2YrhlCkE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-WLorkBww2YrhlCkE .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-WLorkBww2YrhlCkE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-WLorkBww2YrhlCkE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-WLorkBww2YrhlCkE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-WLorkBww2YrhlCkE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-WLorkBww2YrhlCkE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-WLorkBww2YrhlCkE .marker.cross{stroke:#333333;}#mermaid-svg-WLorkBww2YrhlCkE svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-WLorkBww2YrhlCkE g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-WLorkBww2YrhlCkE g.classGroup text .title{font-weight:bolder;}#mermaid-svg-WLorkBww2YrhlCkE .nodeLabel,#mermaid-svg-WLorkBww2YrhlCkE .edgeLabel{color:#131300;}#mermaid-svg-WLorkBww2YrhlCkE .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-WLorkBww2YrhlCkE .label text{fill:#131300;}#mermaid-svg-WLorkBww2YrhlCkE .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-WLorkBww2YrhlCkE .classTitle{font-weight:bolder;}#mermaid-svg-WLorkBww2YrhlCkE .node rect,#mermaid-svg-WLorkBww2YrhlCkE .node circle,#mermaid-svg-WLorkBww2YrhlCkE .node ellipse,#mermaid-svg-WLorkBww2YrhlCkE .node polygon,#mermaid-svg-WLorkBww2YrhlCkE .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-WLorkBww2YrhlCkE .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-WLorkBww2YrhlCkE g.clickable{cursor:pointer;}#mermaid-svg-WLorkBww2YrhlCkE g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-WLorkBww2YrhlCkE g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-WLorkBww2YrhlCkE .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-WLorkBww2YrhlCkE .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-WLorkBww2YrhlCkE .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-WLorkBww2YrhlCkE .dashed-line{stroke-dasharray:3;}#mermaid-svg-WLorkBww2YrhlCkE #compositionStart,#mermaid-svg-WLorkBww2YrhlCkE .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-WLorkBww2YrhlCkE #compositionEnd,#mermaid-svg-WLorkBww2YrhlCkE .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-WLorkBww2YrhlCkE #dependencyStart,#mermaid-svg-WLorkBww2YrhlCkE .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-WLorkBww2YrhlCkE #dependencyStart,#mermaid-svg-WLorkBww2YrhlCkE .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-WLorkBww2YrhlCkE #extensionStart,#mermaid-svg-WLorkBww2YrhlCkE .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-WLorkBww2YrhlCkE #extensionEnd,#mermaid-svg-WLorkBww2YrhlCkE .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-WLorkBww2YrhlCkE #aggregationStart,#mermaid-svg-WLorkBww2YrhlCkE .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-WLorkBww2YrhlCkE #aggregationEnd,#mermaid-svg-WLorkBww2YrhlCkE .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-WLorkBww2YrhlCkE .edgeTerminals{font-size:11px;}#mermaid-svg-WLorkBww2YrhlCkE :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}works withcontainshasAuthor– name: String+writeBook()Publisher– name: String+publish()ShoppingCart– items: List<Product>+addItem(Product)+checkout()Product– id: String– price: doubleHouse– address: StringRoom– size: int

2. 关联关系(Association)详解

特征:

  • 平等的协作关系(无整体-部分概念)
  • 生命周期相互独立
  • 通常通过构造函数或setter注入依赖

代码实现:

// 关联关系示例
class Author {
private Publisher publisher; // 成员变量实现关联

// 依赖通过外部传入(体现生命周期独立)
public Author(Publisher publisher) {
this.publisher = publisher;
}

public void setPublisher(Publisher publisher) {
this.publisher = publisher;
}
}

class Publisher { /* 出版社实现 */ }

Mermaid表示:

#mermaid-svg-MS2F9I6TdalhsbP4 {font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-MS2F9I6TdalhsbP4 .error-icon{fill:#552222;}#mermaid-svg-MS2F9I6TdalhsbP4 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-MS2F9I6TdalhsbP4 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-MS2F9I6TdalhsbP4 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-MS2F9I6TdalhsbP4 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-MS2F9I6TdalhsbP4 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-MS2F9I6TdalhsbP4 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-MS2F9I6TdalhsbP4 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-MS2F9I6TdalhsbP4 .marker.cross{stroke:#333333;}#mermaid-svg-MS2F9I6TdalhsbP4 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-MS2F9I6TdalhsbP4 g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-MS2F9I6TdalhsbP4 g.classGroup text .title{font-weight:bolder;}#mermaid-svg-MS2F9I6TdalhsbP4 .nodeLabel,#mermaid-svg-MS2F9I6TdalhsbP4 .edgeLabel{color:#131300;}#mermaid-svg-MS2F9I6TdalhsbP4 .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-MS2F9I6TdalhsbP4 .label text{fill:#131300;}#mermaid-svg-MS2F9I6TdalhsbP4 .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-MS2F9I6TdalhsbP4 .classTitle{font-weight:bolder;}#mermaid-svg-MS2F9I6TdalhsbP4 .node rect,#mermaid-svg-MS2F9I6TdalhsbP4 .node circle,#mermaid-svg-MS2F9I6TdalhsbP4 .node ellipse,#mermaid-svg-MS2F9I6TdalhsbP4 .node polygon,#mermaid-svg-MS2F9I6TdalhsbP4 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-MS2F9I6TdalhsbP4 .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-MS2F9I6TdalhsbP4 g.clickable{cursor:pointer;}#mermaid-svg-MS2F9I6TdalhsbP4 g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-MS2F9I6TdalhsbP4 g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-MS2F9I6TdalhsbP4 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-MS2F9I6TdalhsbP4 .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-MS2F9I6TdalhsbP4 .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-MS2F9I6TdalhsbP4 .dashed-line{stroke-dasharray:3;}#mermaid-svg-MS2F9I6TdalhsbP4 #compositionStart,#mermaid-svg-MS2F9I6TdalhsbP4 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-MS2F9I6TdalhsbP4 #compositionEnd,#mermaid-svg-MS2F9I6TdalhsbP4 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-MS2F9I6TdalhsbP4 #dependencyStart,#mermaid-svg-MS2F9I6TdalhsbP4 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-MS2F9I6TdalhsbP4 #dependencyStart,#mermaid-svg-MS2F9I6TdalhsbP4 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-MS2F9I6TdalhsbP4 #extensionStart,#mermaid-svg-MS2F9I6TdalhsbP4 .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-MS2F9I6TdalhsbP4 #extensionEnd,#mermaid-svg-MS2F9I6TdalhsbP4 .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-MS2F9I6TdalhsbP4 #aggregationStart,#mermaid-svg-MS2F9I6TdalhsbP4 .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-MS2F9I6TdalhsbP4 #aggregationEnd,#mermaid-svg-MS2F9I6TdalhsbP4 .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-MS2F9I6TdalhsbP4 .edgeTerminals{font-size:11px;}#mermaid-svg-MS2F9I6TdalhsbP4 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}"0..*" works with "1..*"AuthorPublisher

生命周期图示:

#mermaid-svg-6kQ9dd6OxRebW8Pt {font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6kQ9dd6OxRebW8Pt .error-icon{fill:#552222;}#mermaid-svg-6kQ9dd6OxRebW8Pt .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-6kQ9dd6OxRebW8Pt .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-6kQ9dd6OxRebW8Pt .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-6kQ9dd6OxRebW8Pt .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-6kQ9dd6OxRebW8Pt .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-6kQ9dd6OxRebW8Pt .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-6kQ9dd6OxRebW8Pt .marker{fill:#333333;stroke:#333333;}#mermaid-svg-6kQ9dd6OxRebW8Pt .marker.cross{stroke:#333333;}#mermaid-svg-6kQ9dd6OxRebW8Pt svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-6kQ9dd6OxRebW8Pt .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-6kQ9dd6OxRebW8Pt .cluster-label text{fill:#333;}#mermaid-svg-6kQ9dd6OxRebW8Pt .cluster-label span{color:#333;}#mermaid-svg-6kQ9dd6OxRebW8Pt .label text,#mermaid-svg-6kQ9dd6OxRebW8Pt span{fill:#333;color:#333;}#mermaid-svg-6kQ9dd6OxRebW8Pt .node rect,#mermaid-svg-6kQ9dd6OxRebW8Pt .node circle,#mermaid-svg-6kQ9dd6OxRebW8Pt .node ellipse,#mermaid-svg-6kQ9dd6OxRebW8Pt .node polygon,#mermaid-svg-6kQ9dd6OxRebW8Pt .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-6kQ9dd6OxRebW8Pt .node .label{text-align:center;}#mermaid-svg-6kQ9dd6OxRebW8Pt .node.clickable{cursor:pointer;}#mermaid-svg-6kQ9dd6OxRebW8Pt .arrowheadPath{fill:#333333;}#mermaid-svg-6kQ9dd6OxRebW8Pt .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-6kQ9dd6OxRebW8Pt .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-6kQ9dd6OxRebW8Pt .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-6kQ9dd6OxRebW8Pt .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-6kQ9dd6OxRebW8Pt .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-6kQ9dd6OxRebW8Pt .cluster text{fill:#333;}#mermaid-svg-6kQ9dd6OxRebW8Pt .cluster span{color:#333;}#mermaid-svg-6kQ9dd6OxRebW8Pt div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-6kQ9dd6OxRebW8Pt :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}使用可替换不影响Author对象Publisher对象新Publisher对象Publisher销毁

3. 聚合关系(Aggregation)详解

特征:

  • 明确的整体-部分关系(空心菱形端是整体)
  • 部分可以独立于整体存在
  • 整体不负责部分的创建与销毁

代码实现:

// 聚合关系示例
class ShoppingCart {
private List<Product> items = new ArrayList<>(); // 成员变量实现聚合

// 添加已存在的产品对象
public void addItem(Product product) {
items.add(product);
}

// 移除产品但不会销毁它
public void removeItem(Product product) {
items.remove(product);
}
}

class Product { /* 产品独立存在 */ }

Mermaid表示:

#mermaid-svg-JU3cQITPEYs2NOhl {font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-JU3cQITPEYs2NOhl .error-icon{fill:#552222;}#mermaid-svg-JU3cQITPEYs2NOhl .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-JU3cQITPEYs2NOhl .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-JU3cQITPEYs2NOhl .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-JU3cQITPEYs2NOhl .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-JU3cQITPEYs2NOhl .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-JU3cQITPEYs2NOhl .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-JU3cQITPEYs2NOhl .marker{fill:#333333;stroke:#333333;}#mermaid-svg-JU3cQITPEYs2NOhl .marker.cross{stroke:#333333;}#mermaid-svg-JU3cQITPEYs2NOhl svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-JU3cQITPEYs2NOhl g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-JU3cQITPEYs2NOhl g.classGroup text .title{font-weight:bolder;}#mermaid-svg-JU3cQITPEYs2NOhl .nodeLabel,#mermaid-svg-JU3cQITPEYs2NOhl .edgeLabel{color:#131300;}#mermaid-svg-JU3cQITPEYs2NOhl .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-JU3cQITPEYs2NOhl .label text{fill:#131300;}#mermaid-svg-JU3cQITPEYs2NOhl .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-JU3cQITPEYs2NOhl .classTitle{font-weight:bolder;}#mermaid-svg-JU3cQITPEYs2NOhl .node rect,#mermaid-svg-JU3cQITPEYs2NOhl .node circle,#mermaid-svg-JU3cQITPEYs2NOhl .node ellipse,#mermaid-svg-JU3cQITPEYs2NOhl .node polygon,#mermaid-svg-JU3cQITPEYs2NOhl .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-JU3cQITPEYs2NOhl .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-JU3cQITPEYs2NOhl g.clickable{cursor:pointer;}#mermaid-svg-JU3cQITPEYs2NOhl g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-JU3cQITPEYs2NOhl g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-JU3cQITPEYs2NOhl .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-JU3cQITPEYs2NOhl .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-JU3cQITPEYs2NOhl .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-JU3cQITPEYs2NOhl .dashed-line{stroke-dasharray:3;}#mermaid-svg-JU3cQITPEYs2NOhl #compositionStart,#mermaid-svg-JU3cQITPEYs2NOhl .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-JU3cQITPEYs2NOhl #compositionEnd,#mermaid-svg-JU3cQITPEYs2NOhl .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-JU3cQITPEYs2NOhl #dependencyStart,#mermaid-svg-JU3cQITPEYs2NOhl .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-JU3cQITPEYs2NOhl #dependencyStart,#mermaid-svg-JU3cQITPEYs2NOhl .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-JU3cQITPEYs2NOhl #extensionStart,#mermaid-svg-JU3cQITPEYs2NOhl .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-JU3cQITPEYs2NOhl #extensionEnd,#mermaid-svg-JU3cQITPEYs2NOhl .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-JU3cQITPEYs2NOhl #aggregationStart,#mermaid-svg-JU3cQITPEYs2NOhl .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-JU3cQITPEYs2NOhl #aggregationEnd,#mermaid-svg-JU3cQITPEYs2NOhl .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-JU3cQITPEYs2NOhl .edgeTerminals{font-size:11px;}#mermaid-svg-JU3cQITPEYs2NOhl :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}contains0..*ShoppingCart– items: List<Product>+addItem(Product)+removeItem(Product)Product– id: String– price: double

生命周期图示:

#mermaid-svg-bYzxMp3McL8th84g {font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-bYzxMp3McL8th84g .error-icon{fill:#552222;}#mermaid-svg-bYzxMp3McL8th84g .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-bYzxMp3McL8th84g .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-bYzxMp3McL8th84g .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-bYzxMp3McL8th84g .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-bYzxMp3McL8th84g .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-bYzxMp3McL8th84g .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-bYzxMp3McL8th84g .marker{fill:#333333;stroke:#333333;}#mermaid-svg-bYzxMp3McL8th84g .marker.cross{stroke:#333333;}#mermaid-svg-bYzxMp3McL8th84g svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-bYzxMp3McL8th84g .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-bYzxMp3McL8th84g .cluster-label text{fill:#333;}#mermaid-svg-bYzxMp3McL8th84g .cluster-label span{color:#333;}#mermaid-svg-bYzxMp3McL8th84g .label text,#mermaid-svg-bYzxMp3McL8th84g span{fill:#333;color:#333;}#mermaid-svg-bYzxMp3McL8th84g .node rect,#mermaid-svg-bYzxMp3McL8th84g .node circle,#mermaid-svg-bYzxMp3McL8th84g .node ellipse,#mermaid-svg-bYzxMp3McL8th84g .node polygon,#mermaid-svg-bYzxMp3McL8th84g .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-bYzxMp3McL8th84g .node .label{text-align:center;}#mermaid-svg-bYzxMp3McL8th84g .node.clickable{cursor:pointer;}#mermaid-svg-bYzxMp3McL8th84g .arrowheadPath{fill:#333333;}#mermaid-svg-bYzxMp3McL8th84g .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-bYzxMp3McL8th84g .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-bYzxMp3McL8th84g .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-bYzxMp3McL8th84g .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-bYzxMp3McL8th84g .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-bYzxMp3McL8th84g .cluster text{fill:#333;}#mermaid-svg-bYzxMp3McL8th84g .cluster span{color:#333;}#mermaid-svg-bYzxMp3McL8th84g div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-bYzxMp3McL8th84g :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}独立存在区可加入销毁后不影响商品A商品B新商品购物车

4. 关键区别对比表

特征关联(Association)聚合(Aggregation)
UML表示 实线箭头 –> 空心菱形 o–
关系本质 协作关系 整体-部分关系
生命周期依赖 无依赖 部分独立于整体
对象创建 通常外部传入 可外部传入或内部创建
对象销毁责任 不负责关联对象销毁 不负责部分对象销毁
多重性示例 1对1, 1对多, 多对多 整体拥有0…*个部分
典型代码 成员变量持有引用 集合持有部分对象引用
关系强度 较弱 中等(强于关联,弱于组合)

5. 更多示例对比

大学院系结构(聚合)

#mermaid-svg-M8LYU3FQdn2nTOF3 {font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-M8LYU3FQdn2nTOF3 .error-icon{fill:#552222;}#mermaid-svg-M8LYU3FQdn2nTOF3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-M8LYU3FQdn2nTOF3 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-M8LYU3FQdn2nTOF3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-M8LYU3FQdn2nTOF3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-M8LYU3FQdn2nTOF3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-M8LYU3FQdn2nTOF3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-M8LYU3FQdn2nTOF3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-M8LYU3FQdn2nTOF3 .marker.cross{stroke:#333333;}#mermaid-svg-M8LYU3FQdn2nTOF3 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-M8LYU3FQdn2nTOF3 g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-M8LYU3FQdn2nTOF3 g.classGroup text .title{font-weight:bolder;}#mermaid-svg-M8LYU3FQdn2nTOF3 .nodeLabel,#mermaid-svg-M8LYU3FQdn2nTOF3 .edgeLabel{color:#131300;}#mermaid-svg-M8LYU3FQdn2nTOF3 .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-M8LYU3FQdn2nTOF3 .label text{fill:#131300;}#mermaid-svg-M8LYU3FQdn2nTOF3 .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-M8LYU3FQdn2nTOF3 .classTitle{font-weight:bolder;}#mermaid-svg-M8LYU3FQdn2nTOF3 .node rect,#mermaid-svg-M8LYU3FQdn2nTOF3 .node circle,#mermaid-svg-M8LYU3FQdn2nTOF3 .node ellipse,#mermaid-svg-M8LYU3FQdn2nTOF3 .node polygon,#mermaid-svg-M8LYU3FQdn2nTOF3 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-M8LYU3FQdn2nTOF3 .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-M8LYU3FQdn2nTOF3 g.clickable{cursor:pointer;}#mermaid-svg-M8LYU3FQdn2nTOF3 g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-M8LYU3FQdn2nTOF3 g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-M8LYU3FQdn2nTOF3 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-M8LYU3FQdn2nTOF3 .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-M8LYU3FQdn2nTOF3 .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-M8LYU3FQdn2nTOF3 .dashed-line{stroke-dasharray:3;}#mermaid-svg-M8LYU3FQdn2nTOF3 #compositionStart,#mermaid-svg-M8LYU3FQdn2nTOF3 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-M8LYU3FQdn2nTOF3 #compositionEnd,#mermaid-svg-M8LYU3FQdn2nTOF3 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-M8LYU3FQdn2nTOF3 #dependencyStart,#mermaid-svg-M8LYU3FQdn2nTOF3 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-M8LYU3FQdn2nTOF3 #dependencyStart,#mermaid-svg-M8LYU3FQdn2nTOF3 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-M8LYU3FQdn2nTOF3 #extensionStart,#mermaid-svg-M8LYU3FQdn2nTOF3 .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-M8LYU3FQdn2nTOF3 #extensionEnd,#mermaid-svg-M8LYU3FQdn2nTOF3 .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-M8LYU3FQdn2nTOF3 #aggregationStart,#mermaid-svg-M8LYU3FQdn2nTOF3 .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-M8LYU3FQdn2nTOF3 #aggregationEnd,#mermaid-svg-M8LYU3FQdn2nTOF3 .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-M8LYU3FQdn2nTOF3 .edgeTerminals{font-size:11px;}#mermaid-svg-M8LYU3FQdn2nTOF3 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}has faculties1..*University– name: StringDepartment– name: String

师生关系(关联)

#mermaid-svg-t0OUDSXolpyCjUb5 {font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-t0OUDSXolpyCjUb5 .error-icon{fill:#552222;}#mermaid-svg-t0OUDSXolpyCjUb5 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-t0OUDSXolpyCjUb5 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-t0OUDSXolpyCjUb5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-t0OUDSXolpyCjUb5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-t0OUDSXolpyCjUb5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-t0OUDSXolpyCjUb5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-t0OUDSXolpyCjUb5 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-t0OUDSXolpyCjUb5 .marker.cross{stroke:#333333;}#mermaid-svg-t0OUDSXolpyCjUb5 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-t0OUDSXolpyCjUb5 g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-t0OUDSXolpyCjUb5 g.classGroup text .title{font-weight:bolder;}#mermaid-svg-t0OUDSXolpyCjUb5 .nodeLabel,#mermaid-svg-t0OUDSXolpyCjUb5 .edgeLabel{color:#131300;}#mermaid-svg-t0OUDSXolpyCjUb5 .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-t0OUDSXolpyCjUb5 .label text{fill:#131300;}#mermaid-svg-t0OUDSXolpyCjUb5 .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-t0OUDSXolpyCjUb5 .classTitle{font-weight:bolder;}#mermaid-svg-t0OUDSXolpyCjUb5 .node rect,#mermaid-svg-t0OUDSXolpyCjUb5 .node circle,#mermaid-svg-t0OUDSXolpyCjUb5 .node ellipse,#mermaid-svg-t0OUDSXolpyCjUb5 .node polygon,#mermaid-svg-t0OUDSXolpyCjUb5 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-t0OUDSXolpyCjUb5 .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-t0OUDSXolpyCjUb5 g.clickable{cursor:pointer;}#mermaid-svg-t0OUDSXolpyCjUb5 g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-t0OUDSXolpyCjUb5 g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-t0OUDSXolpyCjUb5 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-t0OUDSXolpyCjUb5 .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-t0OUDSXolpyCjUb5 .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-t0OUDSXolpyCjUb5 .dashed-line{stroke-dasharray:3;}#mermaid-svg-t0OUDSXolpyCjUb5 #compositionStart,#mermaid-svg-t0OUDSXolpyCjUb5 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-t0OUDSXolpyCjUb5 #compositionEnd,#mermaid-svg-t0OUDSXolpyCjUb5 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-t0OUDSXolpyCjUb5 #dependencyStart,#mermaid-svg-t0OUDSXolpyCjUb5 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-t0OUDSXolpyCjUb5 #dependencyStart,#mermaid-svg-t0OUDSXolpyCjUb5 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-t0OUDSXolpyCjUb5 #extensionStart,#mermaid-svg-t0OUDSXolpyCjUb5 .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-t0OUDSXolpyCjUb5 #extensionEnd,#mermaid-svg-t0OUDSXolpyCjUb5 .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-t0OUDSXolpyCjUb5 #aggregationStart,#mermaid-svg-t0OUDSXolpyCjUb5 .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-t0OUDSXolpyCjUb5 #aggregationEnd,#mermaid-svg-t0OUDSXolpyCjUb5 .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-t0OUDSXolpyCjUb5 .edgeTerminals{font-size:11px;}#mermaid-svg-t0OUDSXolpyCjUb5 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}teaches10..*Professor– name: StringStudent– id: String

6. 判断技巧流程图

graph TD
A[两个类有成员变量关联] –> B{是否存在整体-部分关系?}
B –>|否| C[关联 Association]
B –>|是| D{部分能否独立存在?}
D –>|是| E[聚合 Aggregation]
D –>|否| F[组合 Composition]

style C fill:#cff,stroke:#333
style E fill:#cfc,stroke:#333
style F fill:#fcc,stroke:#333

关键结论:

  • 语法相同,语义不同:两种关系在代码中都表现为成员变量,区别在于设计意图
  • 生命周期是关键:聚合的部分对象可以脱离整体独立存在
  • 空心菱形是标志:UML中聚合使用空心菱形指向整体端
  • 整体-部分关系:聚合必须具有"包含"语义(如购物车包含商品)
  • 独立性测试:当整体销毁时,如果部分仍然合理存在,就是聚合
  • 通过Mermaid图形的可视化展示,可以清晰看到聚合关系中的空心菱形表示整体端,而关联是简单的实线箭头。在实际建模中,应该根据业务语义(而非代码结构)来决定使用哪种关系。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 如何区分类的关系是关联和聚合?
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!