组合与聚合的关系

在学习UML类图的过程中,组合与聚合的关系书中的说明看的似懂非懂,特地百度记录一下:

在UML中一般包含五种关系:关联,组合,聚合,泛化,依赖。组合与聚合实际上都属于关联。

百度中有一段关于组合与聚合的描述,我觉得很形象:

大雁喜欢热闹害怕孤独 所以它们一直过着群居的生活 这样就有了雁群 每一只大雁都有自己的雁群 每个雁群都有好多大雁 大雁与雁群的这种关系就可以称之为聚合 另外每只大雁都有两只翅膀 大雁与雁翅的关系就叫做组合 有此可见 聚合的关系明显没有组合紧密 大雁不会因为它们的群主将雁群解散而无法生存 而雁翅就无法脱离大雁而单独生存——组合关系的类具有相同的生命周期


从代码的关系式来看

//雁群类

class GooseGroup

{

    public $goose = null;    

    public function __construct(Goose $goose)

    {

        $this->goose = $goose;

    }

}

//大雁类

class Goose

{

    public wings = null;

    public function __construct()

    {

        $this->wings = new Wings();

    }

}


聚合关系的类里含有另一个类作为参数,雁群类(GooseGroup)的构造函数中要用到大雁(Goose)作为参数把值传进来 大雁类(Goose)可以脱离雁群类而独立存在 。

组合关系的类里含有另一个类的实例化大雁类(Goose)在实例化之前一定要先实例化翅膀类(Wings),两个类紧密耦合在一起 它们有相同的生命周期 翅膀类(Wings),不可以脱离大雁类(Goose)而独立存在。


信息的封装性不同:

在聚合关系中,客户端可以同时了解雁群类和大雁类,因为他们都是独立的

而在组合关系中,客户端只认识大雁类,根本就不知道翅膀类的存在,因为翅膀类被严密的封装在大雁类中。


书山有路勤为径 学海无涯苦作舟