`

谈谈聚合跟组合之间的联系

阅读更多
今天由同事突然对这个问题产生兴趣,大家就聚在一起讨论,在这里做个小结。

一般的理解:
聚合:类似于集合,比如一个公司是员工的集合,他们之间构成聚合关系。
组合:更强调整体与部分的关系:整体离不开部分,部分不能离开整体单独存在。比如人的身体和身体上的器官。

c++的表示:
聚合:
class A{}
class B{
  A *a; // 这里只是一个指针,并不负责A对象的死活
}
组合:
class A{}
class B{
  A a; // 在这里,A对象的生命周期由B负责
}

java的表示:
聚合:
class A{}
class B{
  private A a;
  public void setA(A a) {
    this.a = a;
  }
  public A getA() {
    return a;
  }
}
组合:
class A{}
class B{
  private A a = new A();
....// 这里没有setA的方法
}

结论:聚合偏向松散的关系,对象之间依赖关系较弱,而组合则偏向高耦合。对于内存使用,聚合关系的个体可以被聚合外部的对象使用(聚合不负责内部个体的生命周期)。而组合则不行(组合负责内部个体的生命周期),外部对象只能通过该组合的接口(API)间接使用组合内的个体。
0
2
分享到:
评论

相关推荐

    第14讲 谈谈你知道的设计模式1

    设计模式是经验的结晶,代表着在特定上下文中解决问题的最佳实践,有助于提高代码的可读性、可维护性和团队间的沟通效率。 设计模式分为三大类:创建型模式、结构型模式和行为型模式。 1. 创建型模式: - 工厂...

    系统建模与设计的讲义

    此外,类图还可以使用聚合和组合来表示更复杂的关系,聚合表示部分与整体的弱关联,而组合则表示更强烈的拥有关系。 在实际应用中,系统建模与设计通常采用统一建模语言(UML)进行表达。UML提供了一系列图形表示...

    高质量java程序设计读书笔记

    其次,我们来谈谈面向对象编程的两大核心设计方法:继承和组合。继承是OOP中的一个重要概念,它允许一个类(子类)继承另一个类(父类)的属性和方法。这样可以实现代码重用,提高开发效率,并有助于实现多态性。在...

    UMl资料,很好的!

    例如,在绘制E-R图时,我们可以通过UML的关联关系(Association)表示实体间的联系,用泛化关系(Generalization)表示继承关系,用聚合关系(Aggregation)和组合关系(Composition)来表示部分-整体的关系。...

    java-design-patterns:java 学习模式

    设计模式之UML 类图以及类间关系(泛化 、实现、依赖、关联、聚合、组合) 类图用于描述系统中所包含的类以及它们之间的相互关系,帮助人们简化对系统的理解,它是系统分析和设计阶段的重要产物,也是系统编码和测试...

    问题文件

    这种做法允许类间建立关联关系,比如在设计模式中常见的组合模式和聚合模式。例如: ```cpp class BaseClass { public: void baseFunction() {} }; class DerivedClass { private: BaseClass baseObj; // 类包含...

    C#和C++编程语言中的类浅析

    此外,类还可以通过组合(聚合)关系包含其他类的对象,形成复杂的系统结构。在描述中提到的VS2005添加类的过程,展示了如何自动生成头文件(h)和源文件(cpp)以及如何在类中声明和使用其他类。例如,LoftManager...

    NetReg Web Based Administration-开源

    它通过将IP地址和一个前缀(网络掩码的位数)组合在一起,形成一种紧凑的表示方式,有助于避免IP地址的浪费和路由聚合。 NetReg与CIDR的结合,意味着它可以管理和分配这些具有CIDR格式的IP地址段,为网络中的设备...

    go代码-Go 第一个Go程序2

    结构体是一种聚合数据类型,可以将多个值组合在一起,类似于其他语言中的类。 Go还强调并发编程,通过goroutines(轻量级线程)和channels实现。Goroutines允许开发者轻松地并行执行任务,而channels则提供了一种...

Global site tag (gtag.js) - Google Analytics