OO思想中聚合和组合的示例

举报
码乐 发表于 2025/03/28 19:25:20 2025/03/28
【摘要】 1 简介聚合(Aggregation)是一种特殊的关联,表示“整体-部分”关系,部分可以独立于整体存在。聚合是另一种形式的关联,类似于组合。在聚合中,容器对象再次具有对其他对象的多个引用。但是,聚合比组合更松散。对象的生命周期在聚合中不会相互绑定。因此,引用对象可能会在引用对象之前/之后被销毁。 2 聚合的演示让我们向该类添加更多属性来演示聚合,实现代码 type Product stru...

1 简介

聚合(Aggregation)是一种特殊的关联,表示“整体-部分”关系,部分可以独立于整体存在。

聚合是另一种形式的关联,类似于组合。在聚合中,容器对象再次具有对其他对象的多个引用。但是,聚合比组合更松散。对象的生命周期在聚合中不会相互绑定。因此,引用对象可能会在引用对象之前/之后被销毁。

2 聚合的演示

让我们向该类添加更多属性来演示聚合,实现代码

	type Product struct {
		Name  string
		Price float64
	}

	type Cart struct {
		Products []*Product // 聚合:购物车包含多个产品,但产品可以独立存在
	}

	func main() {
		product1 := &Product{Name: "Apple", Price: 1.2}
		product2 := &Product{Name: "Banana", Price: 0.8}

		cart := &Cart{
			Products: []*Product{product1, product2},
		}

		fmt.Println("Cart contains:")
		for _, product := range cart.Products {
			fmt.Printf("- %s: $%.2f\n", product.Name, product.Price)
		}
	}

3. 组合(Composition)的示例

组合也是“整体-部分”关系,但部分无法独立存在,生命周期与整体一致。

组合是一种关联形式,当一个对象的生命与另一个对象的生命紧密结合时就会发生。当主对象消亡(即被删除)时,与该对象关联的所有对象也会消亡。这意味着被引用对象仅包含在引用对象中。

OOP 中有很多现实生活中的合成示例。我们将在这里介绍最常用的合成示例:Vehicle 示例。

实现代码

	type Payment struct {
		Method string
		Amount float64
	}

	type Invoice struct {
		InvoiceID string
		Payment   Payment // 组合:支付信息是发票的一部分,不能单独存在
	}

	func main() {
		invoice := &Invoice{
			InvoiceID: "INV001",
			Payment: Payment{
				Method: "Credit Card",
				Amount: 100.0,
			},
		}

		fmt.Printf("Invoice %s has payment method %s for $%.2f\n", invoice.InvoiceID, invoice.Payment.Method, invoice.Payment.Amount)
	}

4 组合和聚合

组合与聚合的主要区别如下:

    组合									聚合
1	Child 将与 container 类共存			子级可以独立存在
2	关系的一部分。						Has-a 关系
3	更强的关联形式						较弱的构图形式
4	只能有 one-to-one 和 many-to-one 	关系	可以具有一对一、多对一、一对多和多对多关系
5	无法从反向链接更改合成对象。			聚合对象可以删除或替换为其他相同类型的对象。
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。