1. 两种关联关系的特例:
1) 聚合 Aggregation ——
Aggregation: b can live without its context (object of A).
============================================
==C++==
class B{
B* b;
}
==java==
class B{
B b;
public A(B b){
this.b = b;
}
}
聚合是整体与部分、拥有的关系,即 has-a 的关系,此时整体和部分之间可以分离,他们可以具有各自的生命周期 ,部分可以属于多个整体对象,也可以为多个整体对象共享;比如计算机与 CPU 、公司和员工的关系等;表现在代码层面上,和关联关系一致,只能从语义级别区分。
2) 组合 Composition ——
Composition: b's lifetime is up to its context (object of A).
==C++==
class A{
B b;
}
==java==
class A{
B b;
public A(){
b = new B();
}
}
组合也是关联关系的一种特例,他体现一种 contains-a 关系,这种关系比聚合关系更强,也称为强聚合;它同样体现为整体和部分见的关系,但此时整体和部分是不可分割的, 整体的生命周期结束时部分的生命周期也结束 。比如,你和你的大脑。在代码层面上,和关联关系一样,只能从语义级别区分。
2. 几个例子:
演出售票系统 :
在用例驱动的开发过程中,通过分析各个用例及参与者得到类图。分析用例图的过程中需要根据面向对象的原则设计类和关系,根据用例的细节设计类的属性和操作
Composite模式 :
* 从演出售票系统理解 multiplication 的使用—— SubscriptionSeries 和 Ticket 之间的多重性是“ 0...1 ”和“ 3...6 ”:
A. 特定的 1 个 SubscriptionSeries 实例,在数据表中找得到它对应的 3...6 张 Ticket 实例;
B. 特定的 3...6 张 Ticket 实例,在数据表中找得到他们对应的 1 个 SubscriptionSeries ;或者 0 个 SubscriptionSeries ,因为可能这些 Ticket 来自 IndividualReservation