一、关联关系:一个对象知道另一个对象的存在,该对象持有另一个对象的指针或者引用

class X
{
public:X(Y* _ptrY):ptrY_(_ptrY) {}void setY(Y *y) { ptrY_ = y;}void f() { ptrY_->foo();}
private/public:Y* ptrY_;       // X类持有Y的一个指针,可据此调用Y中的成员方法
}

二、依赖关系(dependency):

当类Y与类X彼此独立,而类Y是类X成员函数的一个参数,或者X中成员函数的一个局部变量

class X
{
...void f1(Y y) { ...; y.foo(); }void f2(Y& y) { ...; y.foo(); }void f3(Y* y) { ...; y->foo(); }void f4() { ...; Y y; y.foo(); }void f5() { Y::staticFoo();}
...
}

三、聚合关系(Aggregation):

聚类发生的场景是:一个类是另一个类的集合或者容器,但被包含的类与容器本身并不具备相同的生命期,也就是容器销毁时,其包含的内容未必。关联(association)与聚合(aggregation)的不同之处在于,关联关系不存在一个明确的容器包含另外一个类。比如汽车和轮胎的关系,就是一种聚合关系,汽车包含着轮胎的集合,汽车的销毁,轮胎仍然可以存在。

class Window
{
public://...
private:vectr<Shape*> ptrShapes;
}

四、组合关系(Composition)

组合(composition)是聚合(Aggregation)的增强版。组合和聚合的根本不同在于类与其所持有元素的是否具有相同的生命期,要求必须相同是一种组合关系。

class Circle
{private:...Point center_;
...
}

class X
{
...
Y y;        // composition, 相同的生命期,// 如何是引用或者指针类型,则是关联类型,是一种弱联系
Y b[10];    // 0...10, composition
}class X
{X() { a = new Y[10]; }~X() { delete[] a;}
...Y *a;       // 0...10, composition,X对象析构时,必须对a进行释放}

五、继承(泛化)

类间的继承关系表达的是一种derived class B is a base class A

从生命周期来看,关联时大家的生命周期大家都管不着,聚合时部分的生命周期长于整体,组合时整体与部分共存亡(整体的生命周期比部分略长一点)。

六、关联(association)  聚合(aggregation)  组合(composition)的区别

========================================================

三者之间在c++中都是体现为 "has a" 的关系

在C++中,从实现的角度讲,关联和聚合可以表示为:

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

即类B包含类A的指针;(因为在关联和聚合中,A B的生命周期都是分开的)

而组合可表示为:

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

即类B包含类A的对象。(因为在组合中,A 和 B 的生命周期是一致的,有B就有A,B是大整体,A是B的一部分,如果B没了,那么A也没了),也可以用指针的方式表示,关键看生命周期

那么,关联和聚合的区别在哪里呢?

从语法角度上来说,两者没有区别。

两者的区别在于语义:关联代表 A 和 B 是平等的;聚合代表 A 是 B 的一部分(但是即使这样,AB的生命周期仍然是分开的,生命周期是一致的是组合)

七、组合与聚合的区别

1.组合方式一般代码会这样写
A类的构造方法里创建B类的对象,也就是说,当A类的一个对象产生时,B类的对象随之产生,当A类的这个对象消亡时,它所包含的B类的对象也随之消亡。

2.聚合方式一般代码会这样写:
A类的对象在创建时不会立即创建B类的对象,而是等待一个外界的对象传给它

--------------------------------------------------------------------

对c++,形如:
class B1;
class B2;
class B3;
class A
{
B1 b1;
B2& b2;
B3* b3;
};
B1,B2,B3都是部分类。
B1与A的关系是组成关系。
B2、B3与A的关系是聚合还是组成要根据这一条:部分类是否能脱离整体类而存在。
在这里可以理解他们的生命周期是否同步。

如果b2,b3是通过外部传入的,形如:
class A
{
public:
   A(B3* b3)
   {
      m_b3 = b3);
   }
private:
   B3* m_b3;
};
main()
{
   B2 bbb;
   A a(&bbb);
}
bbb并不会因为a的消亡而消亡。那么就是聚合关系。
反之,如果
m_b3是在A的构造函数new,在A的析构函数delete,两者生命周期一样,那么就是组成关系。
引用的情况类似。

C++ UML类图关系相关推荐

  1. UML类图关系大全 and 报表的基本用法

    UML类图关系大全 1.关联 双向关联: C1-C2:指双方都知道对方的存在,都可以调用对方的公共属性和方法. 在 GOF的设计模式书上是这样描述的:虽然在分析阶段这种关系是适用的,但我们觉得它对于描 ...

  2. 【UML】UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)

    http://www.cnblogs.com/olvo/archive/2012/05/03/2481014.html 继承.实现.依赖.关联.聚合.组合的联系与区别 分别介绍这几种关系: 继承 指的 ...

  3. 【转】 UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合

    目录(?)[-] 继承 实现 依赖 关联 聚合 组合 类图及类图中的关系 继承.实现.依赖.关联.聚合.组合的联系与区别 分别介绍这几种关系: 继承 指的是一个类(称为子类.子接口)继承另外的一个类( ...

  4. UML类图关系表示方法

    本文转载: http://blog.csdn.net/fengsh998/article/details/8105631 分类: UML2012-10-24 10:18 1175人阅读 评论(0) 收 ...

  5. UML类图关系全面剖析[转]

    UML类图关系全面剖析      本文随便转载,请保留出处:http://blog.csdn.net/dylgsy/ UML的类图关系分为: 关联.聚合/组合.依赖.泛化(继承).而其中关联又分为双向 ...

  6. 【重学UML】UML类图关系及其对应代码

    文章目录 一.UML类图关系总览 二.依赖关系 1.关系描述 2.举例 三.关联关系 1.关系描述 2.举例 3.思考 三.聚合.组合关系--关联关系的两种形式 1.关系描述 2.两者关系对比 3.关 ...

  7. UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)

    在UML类图中,常见的有以下几种关系: 泛化(Generalization),  实现(Realization),关联(Association),聚合(Aggregation),组合(Composit ...

  8. java uml类图虚线实线_终于明白六大类UML类图关系了

    UML,全称Unified Modeling Language,统一建模语言.而UML图分为用例图.类图.对象图.状态图.活动图.时序图.协作图.构件图.部署图等9种图. 在面向对象语言中,我们经常看 ...

  9. 【设计模式】UML类图关系与符号

    文章目录 一.UML简介 1.1 UML类图常用关系 1.2 UML模型结构 1.3 UML类的表示 二.类之间的关系 2.1 泛化(Generalization) 2.2 实现(Realizatio ...

  10. UML类图关系(C++)

    ♀ 双向关联(Association) CAssociation1和CAssociation2可以互相调用对方的公共成员函数和成员变量.代码触析: class CAssociation1 { priv ...

最新文章

  1. Dropout 的前世与今生
  2. JS Array.reduce 对象属性累加
  3. Metaphors for a richer understanding of software development -- Code complete reading notes(2)
  4. webdriver鼠标上下滑动
  5. python定义一个_Python,包括定义一个类
  6. VC.NET 字节对齐设置
  7. Ruby 101:重用、隐藏和多态
  8. linux 2.6内核进程调度,Linux2.4与Linux2.6内核调度器的比较研究
  9. php pod模式,k8s pod的4种网络模式最佳实战(externalIPs )
  10. kibana管理界面日志级别查询_微服务海量日志怎么处理,我不允许你还不知道这款工具...
  11. 软件测试——Postman Script脚本功能
  12. excel wps安装access2010数据库引擎
  13. 高仿QQ游戏大厅-支持换肤和控件切换动画
  14. Python字符串拼接的四种方法
  15. CentOS NFS
  16. AI各领域产业发展现状
  17. iqoo9pro和vivox80哪个值得买
  18. python 选择文件对话框插件_Python DearPyGui 常用控件一
  19. POJ 3265 Problem Solving 动态规划
  20. 一、Lua 教程的学习

热门文章

  1. 4.测试基础(软件测试阶段的划分)
  2. linux查看php端口,Linux如何查看端口状态
  3. 大数据有哪些培训机构?
  4. 【分享】关闭科学上网后网络连接故障
  5. Pytorch LSTM 长短期记忆网络
  6. 微软疑淡化邮件服务被黑事件;DOTA2 AI 2:0 完胜世界冠军
  7. 请根据微信登录界面设计测试用例
  8. png图片损坏打不开如何修复?
  9. Java项目:(小程序)前台+后台相结合水果商城系统(spring+spring mvc+mybatis+layui+微信小程)
  10. 剖析 Pexpect