OOP中对象的关系
在面向对象编程(Object-Oriented Programming,OOP)中,”delegation”(委托)、”association”(关联)、”composition”(组合)和”aggregation”(聚合)是几个重要的概念,用于描述对象之间的关系。
委托(Delegation, A uses B):
委托是一种对象之间的关系,其中一个对象将某些任务委托给另一个对象来完成。在委托关系中,一个对象将一部分功能交给另一个对象处理,通过委托可以实现代码的复用和模块化。委托关系通常是动态的,可以在运行时进行修改。
依赖关系(Dependency, A uses B):
依赖关系表示A的某些方法依赖于B的行为。在使用依赖实现的委托中,A接受一个B类型的参数,并将行为委托给B:
关联(Association, A has B):
关联是对象之间的一种关系,表示对象之间的连接或联系。关联关系可以是单向或双向的,可以是一对一、一对多或多对多的。关联关系通常用于描述对象之间的交互关系。
组合(Composition, B is part of A):
组合是一种强关联的关系,表示一个对象是由其他对象组成的整体,对象之间具有“整体-部分”的关系。在组合关系中,部分对象无法独立存在,它们的生命周期与整体对象相互依赖。如果整体对象被销毁,部分对象也会被销毁。
通常表现为静态初始化的字段, 不可通过外部方法更改.
聚合(Aggregation, A owns B):
聚合是一种弱关联的关系,表示一个对象包含其他对象,但被包含对象可以独立存在。聚合关系中,包含对象与被包含对象之间没有强依赖关系,被包含对象可以从一个包含对象中脱离出来,继续存在。聚合关系通常用于表示整体与部分之间的关系,但部分对象的生命周期不受整体对象控制。
通常表现为动态初始化的字段, 可通过外部方法更改.
委托/关联/依赖的关系
- 委托和关联/依赖的关系:在委托(Delegation)中,一个对象(委托者)将任务的执行委托给另一个对象(委托对象)。
委托对象负责执行特定的任务,而委托者可以通过调用委托对象的方法来触发任务的执行。在这种情况下,委托者需要持有委托对象的引用,以便能够调用其方法。这种关联关系要么通过
参数传递来实现, 通过字段(属性)保存委托对象的引用来实现。
前者构成依赖关系,后者构成关联关系 - 关联和聚合/组合的关系: 组合和聚合是关联的两种具体形式
组合是一种比聚合更强的关系,它表示整体对象包含部分对象,并且部分对象无法独立存在。
聚合是一种弱关系,表示整体对象包含部分对象,但部分对象可以独立存在。
小结和讨论
综上所述:
- 委托是一种设计模式, 将任务的执行委托给另一个对象.
- 通过参数进行的委托使类之间存在依赖关系.
- 通过引用进行的委托使类之间存在关联关系.
- 组合是一种强关系,同生共死, 通常在构造函数中创建,在析构函数中销毁
- 聚合是一种弱关系, 仅持有引用. 通常在外部创建,通过调用public方法保存到rep里,在外部某处销毁.
讨论:
- 委托关系的强弱? 依赖 < 聚合 < 关联 < 组合, 越强, 越不容易修改, 越发生在类的内部. 反之, 则容易修改, 并且可以发生在类的外部.
所以依赖关系是最方便修改的, 组合关系是最难修改的. - 临时委托VS永久委托? 依赖关系的委托是临时的,因为没有任何信息记录委托对象。而关联关系的委托是永久的,因为委托对象通过字段的形式保存了下来。