最近一直再看设计之类的博客,但是一直搞不清楚聚合和组合的区别,于是查阅资料了2者之间的关系和区别,顺便回顾一下UML类图的所有关系。
- 继承(Generalization):子类继承父类所有的特征和行为。
- 依赖(Dependency):即使用关系,一个类的实现需要用到另一个类的方法、属性、字段等,尽量不要使两个类相互依赖。
- 关联(Assocation):即拥有关系,一个类是另一个类的属性或者字段。
- 聚合(Aggreation):是一种特殊的关联。整体与部分的关系,且部分可以脱离整体独立存在。
Example:一个航空母舰战斗群拥有母舰、驱逐舰、护卫舰,缺少了母舰或者驱逐舰(护卫舰)也就没有所谓的航空母舰战斗群,但是母舰(驱逐舰、护卫舰)依然存在。
public class Cvbg { public Carrier Carrier { get; set; } public List<Destroyer> Destroyers { get; set; } public List<Frigate> Firgate { get; set; } public Cvbg(Carrier carrier, List<Destroyer> destroyers, List<Frigate> firgate) { Carrier = carrier; Destroyers = destroyers; Firgate = firgate; } }
- 组合(COmposition):也是关联的一种。整体与部分的关系,且部分不可以脱离整体独立存在。组合是比聚合关系还要强的存在,它要求部分对象的生命周期在整体对象的生命周期内。
Example:鸟有一对翅膀,没有鸟,翅膀也就不存在了。
public class Bird { private Wing _leftWing; private Wing _rightWing; public Bird() { this._leftWing = new LeftWing(); this._rightWing = new RightWing(); } } public class Wing { } public class LeftWing : Wing { } public class RightWing : Wing { }