像聚合还分为:非共享聚合、共享聚合、复合聚合等。以及其它内容,下次再补充。
那依赖和聚合\组合、关联等有什么不同呢?
关联是类之间的一种关系,例如老师教学生,老公和老婆,水壶装水等就是一种关系。这种关系是非常明显的,在问题领域中通过分析直接就能得出。
依赖是一种弱关联,只要一个类用到另一个类,但是和另一个类的关系不是太明显的时候(可以说是“uses”了那个类),就可以把这种关系看成是依赖,依赖也可说是一种偶然的关系,而不是必然的关系,就是“我在某个方法中偶然用到了它,但在现实中我和它并没多大关系”。例如我和锤子,我和锤子本来是没关系的,但在有一次要钉钉子的时候,我用到了它,这就是一种依赖,依赖锤子完成钉钉子这件事情。
聚合/组合是一种整体-部分的关系,在问题域中这种关系很明显,直接分析就可以得出的。例如轮胎是车的一部分,树叶是树的一部分,手脚是身体的一部分这种的关系,非常明显的整体-部分关系。
【聚合关系】:是整体与部分的关系,且部分可以离开整体而单独存在。如车和轮胎是整体和部分的关系,轮胎离开车仍然可以存在。
聚合关系是关联关系的一种,是强的关联关系;关联和聚合在语法上无法区分,必须考察具体的逻辑关系。
【组合关系】:是整体与部分的关系,但部分不能离开整体而单独存在。如公司和部门是整体和部分的关系,没有公司就不存在部门。
组合关系是关联关系的一种,是比聚合关系还要强的关系,它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。
上述的几种关系(关联、聚合、组合、依赖)在代码中可能以指针、引用、值等的方式在另一个类中出现,不拘于形式,但在逻辑上他们就有以上的区别。
这里还要说明一下,所谓的这些关系只是在某个问题域才有效,离开了这个问题域,可能这些关系就不成立了,例如可能在某个问题域中,我是一个木匠,需要拿着锤子去干活,可能整个问题的描述就是我拿着锤子怎么钉桌子,钉椅子,钉柜子;既然整个问题就是描述这个,我和锤子就不仅是偶然的依赖关系了,我和锤子的关系变得非常的紧密,可能就上升为组合关系(让我突然想起武侠小说的剑不离身,剑亡人亡...)。这个例子可能有点荒谬,但也是为了说明一个道理,就是关系和类一样,它们都是在一个问题领域中才成立的,离开了这个问题域,他们可能就不复存在了。
我只是复习整理并添加详解而已,我根据初学者阅读慢慢往下学习——所以说适合初学者,大牛可以忽略。
所有的关系有:
UML中描述对象和类之间相互关系的方式包括: 依赖 (Dependency), 关联 (Association), 聚合 (Aggregation), 组合 (Composition), 泛化 (Generalization), 实现 (Realization)等。
依赖(Dependency) :元素A的变化会影响元素B,但反之不成立,那么B和A的关系是依赖关系,B依赖A;类属关系和实现关系在语义上讲也是依赖关系,但由于其有更特殊的用途,所以被单独描述。uml中用带箭头的虚线表示Dependency关系,箭头指向被依赖元素。
B--->A 表示B依赖A,故A的变化当然会影响B。
符号表示:虚线箭头表示---------- >
1、依赖关系也是类与类之间的联结
2、依赖总是单向的。(注意,要避免双向依赖。一般来说,不应该存在双向依赖。)
3、依赖关系在 Java 或 C++ 语言中体现为局部变量、方法的参数或者对静态方法的调用。
局部变量:
classPerson{VoidBuy(){Car car;}}
方法的参数:
classPerson{void buy(Car car){…}}
对静态方法的调用: (这个如果有错误请指正)
classCar{public:staticvoidSay(){ cout<<"I'm running!"<<endl;}};classPerson{public:voidPersonSay(){Car::Say();}};
PS:人依赖车,车的变化会影响到人的出行,以及花费等等。
- 关联(Association) :元素间的结构化关系,是一种弱关系,被关联的元素间通常可以被独立的考虑。uml中用实线表示Association关系,箭头指向被依赖元素。
符号表示:实线箭头表示
1、关联关系是类与类之间的联结,它使一个类知道另一个类的属性和方法。
2、关联可以是双向的,也可以是单向的(还有自身关联)。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。
3、在 Java 或 c++ 中,关联关系是通过使用成员变量来实现的。
class徒弟{};class唐僧{protected: list<徒弟> tdlist;};
PS:唐僧关联徒弟,徒弟这里可以有多个,故写1对多。
- 聚合(Aggregation) :关联关系的一种特例,表示部分和整体(整体 has a 部分)的关系。uml中用带空心菱形头的实线表示Aggregation关系,菱形头指向整体。
符号表示:带空心菱形实线箭头表示
1、聚合关系是关联关系的一种,是强的关联关系。
2、聚合是整体和部分之间的关系,例如汽车由引擎、轮胎以及其它零件组成。
3、聚合关系也是通过成员变量来实现的。但是,关联关系所涉及的两个类处在同一个层次上,而聚合关系中,两个类处于不同的层次上,一个代表整体,一个代表部分。
4、关联与聚合仅仅从 Java 或 C++ 语法上是无法分辨的,必须考察所涉及的类之间的逻辑关系。
class引擎{};class轮胎{};class汽车{protected:引擎 engine;protected:轮胎 tyre[4];};
PS:汽车由包含引擎和轮胎等。我觉得这篇博文讲的十分到位,聚合首先要记住的是符号(空心菱形带箭头指向),然后就是聚合是强关联,在C++代码层面上是看不出谁是谁的,这个空心菱形是有道理的,就是单独的一个是空壳的,部分组装起来才是整体,就像这边的例子,汽车是整体,而引擎对于汽车来说是一部分,只有引擎没有其他的,对于整体汽车来说是空荡荡的,还没组装完整,这个说法只是便于记忆,没有其他意思。要记住整体与部分,层次不同。
- 组合(Composition) :组合是聚合关系的变种,表示元素间更强的组合关系。如果是组合关系,如果整体被破坏则个体一定会被破坏,而聚合的个体则可能是被多个整体所共享的,不一定会随着某个整体的破坏而被破坏。uml中用带实心菱形头的实线表示Composition关系,菱形头指向整体。
符号表示:带实心菱形实线箭头表示
1、合成关系是关联关系的一种,是比聚合关系还要强的关系。
2、它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。
class肢{};class人{protected:肢 limb[4];};
PS:第二点说的太棒了,举的例子也是相当棒!实心的菱形可以这样记忆,都是实实在在的肉(关系好)啊,呵呵~~~~
一般化关系(泛化和实现): 表示类与类之间的继承关系,接口与接口之间的继承关系,或类对接口的实现关系。一般化关系是子类指向父类的,或从实现接口的类指向被实现的接口,与继承或实现的方向相反。如下图所示:
- 泛化(Generalization) :通常所说的继承(特殊个体 is kind of 一般个体)关系,不必多解释了。uml中用带空心箭头的实线线表示Generalization关系,箭头指向一般个体。
- 实现(Realize) :元素A定义一个约定,元素B实现这个约定,则B和A的关系是Realize,B realize A。这个关系最常用于接口。uml中用空心箭头和虚线表示Realize关系,箭头指向定义约定的元素。
PS:上面两个关系已经相当清楚了,不用多作解释了。
其中依赖(Dependency)的关系最弱( 函数参数、局部变量、静态方法调用 ),而关联(Association)( 成员变量 ),聚合(Aggregation)( 成员变量 ),组合(Composition)( 成员变量 )表示的关系依次增强。换言之关联,聚合,组合都是依赖关系的一种,聚合是表明对象之间的整体与部分关系的关联,而组合是表明整体与部分之间有相同生命周期关系的聚合。
PS:这句话说的很棒,在聚合关系中的例子来说,引擎是可以单独发动的,可以给小汽车也可以给面包车,那么聚合关系的成员变量一般是指针,这样的话就比较贴切了 。
而关联与依赖的关系用一句话概括下来就是,依赖描述了对象之间的调用关系(PS:在类中不会长久存在,就局部的存在而已,不与类拥有同样的生命周期(理解用)。),而关联描述了对象之间的结构关系(例子:部门结构等)。
后面的例子将针对某个具体目的来独立地展示各种关系。虽然语法无误,但这些例子可进一步精炼,在它们的有效范围内包括更多的语义。
注:上面看清楚是局部变量还是成员变量。
最后,感谢原作者!
相关推荐
UML类图符号 UML类图符号 UML类图符号 UML类图符号 UML类图符号 UML类图符号
UML类图符号总结,包括UML类图符号的使用与定义,供大家一起共同分享学习。
UML类图符号简介.docx
类图基本符号可拆分为虚线,箭头,实线,空心右三角,实心右三角,空心菱形和实心菱形。由这些基本的图形进行组合构成了类图的基本符号。这里要注意这几个符号的顺序,代表了类与类之间关系的耦合程度。越向右耦合度...
UML类图符号简介[归纳].pdf
介绍了UML类途中各种符号的作用,对了解类的含义及C++编程有一定提高作用。
清晰简单的UML标识说明,对UML建模初学者十分有用。
UML类图(Class diagram)是统一建模语言(UML)的一种图形表示,用于显示系统的静态结构,特别是模型中存在的类、类的内部结构以及它们与其他类的关系。 在类图中,每个类由一个包含类名、属性和方法的矩形表示,...
摘 要 统一建模语言( %+/) 是一种通用的图形化建模语言, 在面向对象系统的分析和设计中, 它已...文章采用 符号来表示 %+/ 类图的组成元素的语法和语义及其映射 关系, 最后对 %+/ 类图的一些性质进行分析和验证。
1.软件思想UML:UML类图符号(依赖、关联、聚合、组合、泛化)、UML类符号相互之间的区别(聚合与组合、关联和聚合、关联和依赖、泛化和实现)。 2.Sping Boot:Spring Boot环境配置、Spring Boot核心配置和注解、...
常见的UML符号说明,比较适合编写论文时找不见官方的描述
Common Logic 是一阶逻辑的一个特殊拓展,语法简洁,无符号,易读易掌握易使用,语义精确,满足一阶模型理论,相较于其它逻辑语言,更适合UML 类图进行形式化规约。因此,提出采用Common Logic 对UML 类图进行形式化...
本文来自于csdn,文章主要以一个实例为入口介绍了uml类图的基本图示法等相关内容,希望对您的学习有所帮助。举一个简单的例子,来看这样一副图,其中就包括了UML类图中的基本图示法。 首先,看动物矩形框,它代表一...
我给你举一个例子,来看这样一幅图,其中就包括了UML类图中的基本图示法。”UML类图图示样例大鸟:“首先你看那个‘动物’矩形框,它就代表一个类(Class)。类图分三层,第一层显示类的名称,如果是抽象类,则就用...
本文重点讨论UML类图中的元素和UML关系图符号。类图是最常用的UML图,它用于描述系统的结构化设计。其中包括类关系以及与每个类关联的属性及行为。类图能出色地表示继承与合成关系。为了将类图作为一种高效的沟通...
UML九种建模图--类图 UML提供了九种建模图,其中类图是最常用的一种。类图是一种静态模型,主要用来显示系统中的类、接口以及它们之间的静态结构和关系。这些关系包括关联、泛化和依赖等。类图是面向对象系统建模的...
两者采用不同的图形符号系统。 4、Statopia是一家大型公司,由于公司业务的扩大,准备对公司已有的软件系统进行升级,因此委托ObjectR公司负责该项工作。Statopia公司所使用的系统是很久以前开发的,且不是用OO方法...