OO思想中聚合和组合的示例
【摘要】 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)