像聚合还分为:非共享聚合、共享聚合、复合聚合等。以及其它内容,下次再补充。
那依赖和聚合\组合、关联等有什么不同呢?
关联是类之间的一种关系,例如老师教学生,老公和老婆,水壶装水等就是一种关系。这种关系是非常明显的,在问题领域中通过分析直接就能得出。
依赖是一种弱关联,只要一个类用到另一个类,但是和另一个类的关系不是太明显的时候(可以说是“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类图符号是 Unified Modeling Language(统一建模语言)的核心组成部分之一,用于描述系统中的类和对象之间的关系。类图是UML中的静态结构模型,用于描述系统中的类、对象、接口、继承、实现...
下面我们将详细解释UML类图中各符号的含义。 1. 类(Class):在UML类图中,类通常用三层矩形表示。第一层写类的名称,如果类是抽象的,则名称以斜体显示。第二层列出类的属性(fields)和字段,第三层列出类的方法...
### UML类图符号及其含义详解 #### 一、概述 统一建模语言(UML)是一种广泛应用于软件工程领域的图形化规范,用于描述系统的结构和行为。UML类图是其中最重要的组成部分之一,用于可视化地展示系统中的类、接口以及...
UML类图符号简介.docx
**UML类图符号简介** 在软件开发过程中,UML(统一建模语言)是一种用于可视化和描述系统设计的强大工具,其中类图是UML中最基础的图表之一,用于描绘类与类之间的关系。以下是对UML类图中各种符号的详细解释: 1....
在IT行业中,UML(统一建模语言)是一种标准的...学习这个案例,你可以了解如何将业务逻辑转化为UML类图,再将类图转换为实际的C++代码。这有助于提升你对面向对象编程的理解,同时也能掌握UML在软件工程中的实际应用。
综上所述,UML类图中的类是系统建模的关键元素,它们通过抽象类和具体类的区分来表达层次结构,通过主动类和非主动类来描述行为发起者和接收者。属性和操作则构成了类的核心特性,帮助我们理解和设计系统的结构和...
### UML类图关系详解 #### 一、引言 UML(Unified Modeling Language,统一建模语言)是一种广泛应用于软件工程领域的图形化规范,用于描述软件系统的结构和行为。UML类图作为UML中的一种重要图表类型,主要用于...
### UML类图关系详解 #### 一、引言 统一建模语言(Unified Modeling Language,简称UML)是一种广泛使用的图形化语言,用于软件工程的设计、开发和维护。其中,UML类图是用于描述系统中类的静态结构的重要组成...
在UML类图中,主要元素包括: 1. 类(Class):类是一个复杂的数据类型,包含数据(属性)和操作(方法)。在UML图中,类通常用三层矩形表示,第一层写类名,第二层列属性,第三层列方法。类的访问修饰符(public、...
通过“UML类图关系大全.doc”和“UML类图简介.doc”,你可以更详细地了解这些关系的图形表示、符号含义以及在实际设计中的应用。学习和熟练掌握这些关系对于理解和设计复杂的软件系统至关重要,因为它们有助于清晰地...
在UML类图中,每个类都有其自己的属性和方法,可以使用“-”、“+”和“#”符号来表示访问控制权限。 UML类图的应用非常广泛,包括软件设计、系统分析、项目管理等领域。通过UML类图,可以对系统的静态结构进行描述...
以下是对UML类图中各种元素的详细说明: 1. 类(Class): 类通常用矩形表示,包含三个主要区域。第一层是类名,抽象类的名称用斜体表示。第二层是类的属性(Fields)和特性(Attributes),它们描述了类的数据...
### 基于UML类图的类之间依赖关系图论问题研究 #### 摘要及背景介绍 本文探讨了UML(统一建模语言)类图中的类间依赖关系,并通过图论的方法对其进行深入分析。随着面向对象编程方法在软件开发领域的广泛应用,UML...
本文通过一个具体的UML类图例子,深入探讨类图中的各种关系和符号,以便更好地理解其在面向对象系统设计中的应用。 首先,让我们从最基本的类关系开始。在面向对象编程中,继承是实现代码复用和建立类层级结构的...
UML类图设计模式概述 UML类图是一种统一建模语言(Unified Modeling Language),用于描述软件系统的结构和行为。它是设计模式的核心组件之一,广泛应用于软件开发、系统设计和业务分析中。 类图的组成 类图是UML...
UML类图通过图形符号清晰地表示出这些组成部分及其关系,使得开发者能够直观地理解系统的静态结构。 #### 三、UML类图的形式化表示 为了精确地表示UML类图的语法和语义,可以使用Z语言。下面是一些基本的概念及其...