组合和聚合的区别讨论

    今天python提出一个问题,组合和聚合之间存在什么样的区别。虽然很早前我就看过,但是毕竟是三四年前的事情了。经过上网查找资料,大部分的说法如下:

    组合和聚合都是整体和部分的关系,不同点在于是否控制从属对象的生命期。比如人和鞋子的关系,如果一个人死了,但是他穿的鞋子还在,这就是一种聚合关系。人和跳动的心脏的关系,如果一个人死了,那么心脏不再跳动,这就是组合的关系。虽然都是一种从属关系,组合控制从属对象的生命期。但是他们的实现形式都是相同的,组合是一种特殊的聚合关系。

    下面的代码为python所写,经过我们的讨论,基本上就是组合和聚合的体现:

组合:

class B

{

};

class A

{

B _b;

};

当A的对象析构的时候,B的对象同时也被析构掉,因此A的生命期影响着B的生命期。

聚合:

class A

{

private:

B* _ptrB;

public:

void SetByPtr(B* b)

{

_ptrB=b;

}

};

这样,在B的对象析构掉的时候,可能删除掉指针_ptrB,但是此指针指向的对象并未被析构,也就是B的对象的生命期对A对象的生命期没有影响

### 聚合组合关系的区别及应用场景 #### 定义区分 聚合组合都是面向对象设计中用来描述“整体-部分”关系的设计模式,但它们的本质区别在于对象间的依赖程度以及生命周期管理方式。 - **聚合**表示一种较弱的“整体-部分”关系,在这种情况下,“部分”对象可以在脱离“整体”的情况下独立存在[^4]。例如,一辆汽车与其驾驶员的关系可以被看作是聚合:即使没有特定的汽车实例,驾驶员仍然能够单独存在。 - **组合**则代表了一种更为紧密的“整体-部分”关系。“部分”对象的生命周期完全由“整体”控制,一旦“整体”销毁,则其所有的“部分”也会随之消失。比如,一个公司部门及其员工之间的关系属于组合:如果某个部门解散了,那么该部门下的所有员工也应重新分配或者不再隶属于这个部门。 #### 生命周期管理差异 在聚合的情况下,组件(即“部分”)拥有自己的生存周期,并不严格受限于容器(即“整体”)。这意味着即便删除掉某个集合体之后,它的成员依然可能继续存在于程序运行环境中[^1]。 而在组合结构里,当父级元素被摧毁时,它所包含的所有子节点都会自动清除,因为这些子节点的存在意义仅仅是为了服务于那个特定的父亲实体[^2]。 #### 应用场景举例说明 对于何时选用哪种形式来构建我们的应用程序逻辑层面上来说: - 如果我们希望创建一些相对固定的内部构成单元,并且这些组成部分不应该也不允许离开主体而独自存活下去的话,就应该采用组合策略。典型例子如文件夹与文档之间——每份文档都必须归属于某一层目录之下才能有意义地存储起来[^5]; ```java public class Folder { private List<Document> documents; public void addDocument(Document doc){ this.documents.add(doc); } // Other methods... } public class Document{ String content; Date creationDate; // Constructor and other methods... } ``` - 反之,当我们遇到那些虽然当前暂时联系在一起但实际上各自具备完整性的个体事物的时候就可以考虑运用聚合手法来进行处理。像学校里的教师队伍同各个班级学生群体相互作用的情形就非常适合利用这种方式表达出来[^3]。 ```java public class Teacher { private Set<Classroom> classrooms; public void assignToClass(Classroom classroom){ this.classrooms.add(classroom); } // Additional properties & functions ... } public class Classroom { int roomNumber; List<Student> studentsList; // Initialization code plus more features here .. } ``` #### 设计考量因素总结 为了达到良好的软件工程实践效果,在决定使用何种型的关联之前应当仔细权衡以下几个方面的问题: - 是否有必要建立如此亲密无间式的绑定? - 预期目标系统未来可能发生怎样的变化趋势? - 如何平衡好重用性与复杂度两者之间的矛盾冲突? 通过上述讨论可以看出,尽管二者表面上看似相似,但在深层次上却存在着本质上的不同之处。因此,在实际开发过程中要根据具体情况灵活选取最合适的方案加以实施才是明智之举。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值