zoukankan      html  css  js  c++  java
  • UML的关联(Association), 聚合(Aggregation), 组合(Composition)区别

    转载:http://blog.csdn.net/ocean181/article/details/6117369

    UML的关联(Association), 聚合(Aggregation), 组合(Composition)区别 

    三者描述对象的附属[也就是依赖]关系: 关联<聚合<组合, 依赖关系是逐渐加强的.

    inheritance: "a kind of": 猫是一种动物,说明猫从动物继承;

    association: 两者之间存在某种关联即可,很弱的关系,如student and course, 每个学生可以选不同的课,每门课上有不同学生;

    aggregation: "consist of":整体与部分之间的关系,但这里部分可以脱离整体单独存在,如MP3上所插的耳机,MP3包含耳机,但这个耳机也可以单独存在,或者插在其他电脑上。

    composition: 更强的aggregation,这里部分不能脱离整体而存在,这个部分是整体的私有财产。比如Apple Itouch上的电池,原则不能拆下来单独使用。

    关联

    关联(association)表明某个对象可以向另一个对象通过某种方式发送消息。发送消息的方法可以通过指针成员变量, 也可以是方法参数、局部变量等等。例如:

    uml-aac-diff-01.png
    class A
    {
    private:
    B* itsB;
    };

    聚合

    聚合(aggregation)是一种特殊的联系,它表明了“部分”到“整体”的关系,显著的特点就是不能包含循环的联系 (就是说,部分中不能包含整体)。如:

    uml-aac-diff-02.png
    class Node
    {
    private:
    vector<Node*> itsNodes;
    };

    上述代码只有当子节点不会成为父节点的父节点时(即,必须是树结构,不能是图结构),才能称之为聚合。

    从实现的角度讲,聚合可以表示为: 

    class A {...} class B { A* a; .....} 

    组合

    组合(composition)跟聚合几乎相同,唯一的区别就是“部分”不能脱离“整体”单独存在,就是说, “部分”的生命期不能比“整体”还要长。例如:

    uml-aac-diff-03.png
    class Car
    {
    public:
    virtual ~Car() {delete itsCarb;}
    private:
    Carburetor* itsCarb
    };
    
    
    从实现的角度讲,组合实现的形式是: 
    
    class A{...} class B{ A a; ...}
    
  • 相关阅读:
    简单网络问题排查记录一
    安装mysql_sniffer报错undefined reference to symbol 'pthread_setspecific@@GLIBC_2.2.5'问题
    tengine安装ngx_http_lua_module
    Django——URL详解/Django中URL是如何与urls文件匹配的
    Python学习——enumerate
    Python学习——装饰器/decorator/语法糖
    缓存优化
    页面重绘 回流及其优化
    window.getComputedStyle()方法的使用及其扩展
    java 三个循环的优缺点
  • 原文地址:https://www.cnblogs.com/thefirstfeeling/p/5203340.html
Copyright © 2011-2022 走看看