UML类图关系

合集下载

UML类图中关联关系的三种导航方式

UML类图中关联关系的三种导航方式

UML类图中关联关系的三种导航方式在软件开发中,UML(统一建模语言)类图是一种常用的建模工具,用于描述系统中的类和它们之间的关系。

其中,关联关系是类图中最基本的一种关系,描述了类之间的连接。

在关联关系中,导航方式是指一个类如何访问与之相关联的其他类的对象。

在UML类图中,有三种常见的导航方式:单向导航、双向导航和自关联导航。

1. 单向导航单向导航是指一个类可以访问与之关联的其他类的对象,而被关联的类不能直接访问该类的对象。

这种导航方式常见于一对多的关联关系,其中一个类是主导类,而另一个类是从属类。

举个例子,考虑一个图书馆管理系统,图书馆类与图书类之间存在一种关联关系,一个图书馆可以管理多本图书。

在这种情况下,图书馆类可以通过关联关系访问图书类的对象,但是图书类无法直接访问图书馆类的对象。

2. 双向导航双向导航是指两个类可以互相访问对方的对象。

这种导航方式常见于一对一或多对多的关联关系,其中两个类都可以主动访问对方的对象。

继续以图书馆管理系统为例,考虑一个借阅记录类与读者类之间的关联关系。

一个借阅记录可以关联一个读者,同时一个读者也可以关联多个借阅记录。

在这种情况下,借阅记录类和读者类可以通过关联关系互相访问对方的对象。

双向导航可以提供更灵活的访问方式,但也需要注意双向关联的管理和维护。

在设计时,需要考虑到两个类之间的依赖关系和业务逻辑,避免出现循环依赖或不一致的情况。

3. 自关联导航自关联导航是指一个类与自身存在关联关系,可以访问自身的对象。

这种导航方式常见于树状结构或层级结构的模型。

举个例子,考虑一个组织机构管理系统,组织类与自身存在一种关联关系,一个组织可以包含多个子组织。

在这种情况下,组织类可以通过关联关系访问自身的对象,实现对组织结构的层级管理。

自关联导航可以用于描述递归结构或层级结构,提供了一种方便的方式来处理复杂的关系。

但是,在使用自关联导航时需要注意循环引用的问题,避免出现无限循环或死循环的情况。

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

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

继承、实现、依赖、关联、聚合、组合的联系与区别分别介绍这几种关系:继承实现指的是一个class 类实现interface 接口(可以是多个)的功能;实现是类与接口之间最常 见的关系;在Java 中此类关系通过关键字implements 明确标识,在设计时一般没有争 议性;依赖可以简单的理解,就是一个类A 使用到了另一个类B ,而这种使用关系是具有偶然性的、、 临时性的、非常弱的,但是B 类的变化会影响到A ;比如某人要过河,需要借用一条船, 此时人与船之间的关系就是依赖;表现在代码层面,为类B 作为参数被类A 在某个method 方法中使用;Inte rfare指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可 以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系;在Java 中此类关系通过关键字extends 明确标识,在设计时一般没有争议性;b lnterface_BQlass_A ClaSs_B关联他体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这 种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而 且双方的关系一般是平等的、关联可以是单向、双向的;表现在代码层面,为被关联类B 以类属性的形式出现在关联类A 中,也可能是关联类A 引用了一个类型为被关联类B 的全 局变量;聚合聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a 的关系,此 时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象, 也可以为多个整体对象共享;比如计算机与CPU 、公司与员工的关系等;表现在代码层面, 和关联关系是一致的,只能从语义级别来区分;组合组合也是关联关系的一种特例,他体现的是一种contains-a 的关系,这种关系比聚合更强, 也称为强聚合;他同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生 命周期结束也就意味着部分的生命周期结束;比如你和你的大脑;表现在代码层面,和关联 关系是一致的,只能从语义级别来区分;对于继承、实现这两种关系没多少疑问,他们体现的是一种类与类、或者类与接口间的纵向 关系;其他的四者关系则体现的是类与类、或者类与接口间的引用、横向关系,是比较难区 分的,有很多事物间的关系要想准备定位是很难的,前面也提到,这几种关系都是语义级别Cl3ss A 十 depend<Qlass.B classBJ ;:;;VoidClass_B的,所以从代码层面并不能完全区分各种关系;但总的来说,后几种关系所表现的强弱程度依次为:组合>聚合>关联》依赖;聚合跟组合其实都属于关联只不过它们是两种特殊的关联因为本是同根生所以它们之间难 免会有相似之处下面让我们一起来看一下它们之间有何不同聚合与组合的概念相信不用我在此赘述大家就已经了解了下面直接上例子 程老师的《大话》里举大那个大雁的例子很贴切在此我就借用一下大雁喜欢热闹害怕孤独所 以它们一直过着群居的生活这样就有了雁群每一只大雁都有自己的雁群每个雁群都有好多 大雁大雁与雁群的这种关系就可以称之为聚合另外每只大雁都有两只翅膀大雁与雁翅的关 系就叫做组合有此可见聚合的关系明显没有组合紧密大雁不会因为它们的群主将雁群解散 而无法生存而雁翅就无法脱离大雁而单独生存一一组合关系的类具有相同的生命周期聚合关系图:构造函数不同雁群类:[csharp] view plaincopypublic class GooseGroup { public Goose goose; public GooseGroup(Goose goose) { this .goose = goose;} 10. }[csharp] view plaincopy1. 2. 3.4.5. 6.7. 8.9. 组合关系图:从从代码上看这两种关系的区别在于:1.public class GooseGroup2.{3.public Goose goose;4.5.6.public GooseGroup(Goose goose)7.{8.this.goose = goose;9.}10.}大雁类:[csharp] view plaincopy1.public class Goose2.{3.public Wings wings;4.5.public Goose()6.{7.wings=new Wings();8.}9.}[csharp] view plaincopy1.public class Goose2.{3.public Wings wings;4.5.public Goose()6.{7.wings=new Wings();8.}9.}聚合关系的类里含有另一个类作为参数雁群类(GooseGroup)的构造函数中要用到大雁(Goose)作为参数把值传进来大雁类(Goose)可以脱离雁群类而独立存在组合关系的类里含有另一个类的实例化大雁类(Goose)在实例化之前一定要先实例化翅膀类(Wings)两个类紧密耦合在一起它们有相同的生命周期翅膀类(Wings)不可以脱离大雁类(Goose)而独立存在信息的封装性不同在聚合关系中,客户端可以同时了解雁群类和大雁类,因为他们都是独立的而在组合关系中,客户端只认识大雁类,根本就不知道翅膀类的存在,因为翅膀类被严密的封装在大雁类中。

UML类图中的依赖关系详解及实例分析

UML类图中的依赖关系详解及实例分析

UML类图中的依赖关系详解及实例分析UML(Unified Modeling Language)类图是软件开发中常用的一种图形化工具,用于描述系统中的类、接口、关系等。

其中,依赖关系是类图中的一种重要关系,用于表示一个类对另一个类的使用或依赖。

本文将详细解析UML类图中的依赖关系,并通过实例分析加深理解。

依赖关系是一种比较弱的关系,表示一个类在某个特定的场景下,需要使用另一个类的功能或服务。

在UML类图中,依赖关系用带箭头的虚线表示,箭头从使用类指向被使用类。

依赖关系的特点是临时性和方向性,即一个类对另一个类的依赖可能是暂时的,而且依赖关系是单向的。

依赖关系可以通过类之间的方法调用、参数传递、返回值等方式来实现。

当一个类在某个方法中调用了另一个类的方法,或者将另一个类的实例作为参数传递给自己的方法,就表示存在依赖关系。

例如,一个订单类可能依赖于一个库存管理类,以获取商品的库存信息。

依赖关系在软件设计中起到了重要的作用。

它可以帮助开发人员将系统分解为更小的模块,提高代码的可维护性和可重用性。

通过依赖关系,一个类只需要关注自己需要使用的功能,而不需要了解被使用类的具体实现。

这样,当被使用类发生变化时,只需要修改被使用类的代码,而不需要修改使用类的代码。

下面通过一个实例来进一步说明依赖关系的应用。

假设我们正在开发一个在线购物系统,其中包含订单管理和库存管理两个模块。

在订单管理模块中,需要根据用户提交的订单信息查询库存,并更新库存信息。

这时,订单管理模块就依赖于库存管理模块。

在UML类图中,我们可以将订单管理类和库存管理类分别表示为一个矩形框,并用虚线箭头连接两个类。

箭头的方向从订单管理类指向库存管理类,表示订单管理类依赖于库存管理类。

在订单管理类中,我们可以定义一个方法,例如`checkInventory()`,该方法内部调用库存管理类的方法来查询库存。

通过依赖关系,订单管理模块可以独立于库存管理模块进行开发和测试。

UML图中类之间的关系_依赖,泛化,关联,聚合,组合,实现答辩

UML图中类之间的关系_依赖,泛化,关联,聚合,组合,实现答辩

UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现1.2.3.4.5.6.类与类图1 类(Class封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性、操作、关系的对象集合的总称。

2 在系统中,每个类具有一定的职责,职责指的是类所担任的任务,即类要完成什么样的功能,要承担什么样的义务。

一个类可以有多种职责,设计得好的类一般只有一种职责,在定义类的时候,将类的职责分解成为类的属性和操作(即方法)。

3 类的属性即类的数据职责,类的操作即类的行为职责一、依赖关系(Dependence依赖关系(Dependence):假设A类的变化引起了B 类的变化,则说名B类依赖于A类。

• 依赖关系(Dependency 是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系。

大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数。

• 在UML中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。

[java] view plaincopyprint?1. public class Driver2. {3. public void drive(Car car4. {5. car.move(;6. }7. ……8. }9. public class Car10. {11. public void move(12. {13. ......14. }15. ……16. }{car.move(;}……}public class Car{public void move({......}……}依赖关系有如下三种情况:1、A类是B类中的(某中方法的)局部变量;2、A类是B类方法当中的一个参数;3、A类向B类发送消息,从而影响B类发生变化;GeneralizationGeneralization A是B和C的父类,B,C具有公共类(父类)A,说明A是B,C的一般化(概括,也称泛化)• 泛化关系(Generalization也就是继承关系,也称为“is-a-kind-of”关系,泛化关系用于描述父类与子类之间的关系,父类又称作基类或超类,子类又称作派生类。

UML类图及类与类之间的关系

UML类图及类与类之间的关系

UML类图及类与类之间的关系原⽂地址:类图⽤于描述系统中所包含的类以及它们之间的相互关系,帮助⼈们简化对系统的理解,它是系统分析和设计阶段的重要产物,也是系统编码和测试的重要模型依据。

1. 类类(Class)封装了数据和⾏为,是⾯向对象的重要组成部分,它是具有相同属性、操作、关系的对象集合的总称。

在系统中,每个类都具有⼀定的职责,职责指的是类要完成什么样的功能,要承担什么样的义务。

⼀个类可以有多种职责,设计得好的类⼀般只有⼀种职责。

在定义类的时候,将类的职责分解成为类的属性和操作(即⽅法)。

类的属性即类的数据职责,类的操作即类的⾏为职责。

设计类是⾯向对象设计中最重要的组成部分,也是最复杂和最耗时的部分。

在软件系统运⾏时,类将被实例化成对象(Object),对象对应于某个具体的事物,是类的实例(Instance)。

类图(Class Diagram)使⽤出现在系统中的不同类来描述系统的静态结构,它⽤来描述不同的类以及它们之间的关系。

在系统分析与设计阶段,类通常可以分为三种,分别是实体类(Entity Class)、控制类(Control Class)和边界类(Boundary Class),下⾯对这三种类加以简要说明:(1) 实体类:实体类对应系统需求中的每个实体,它们通常需要保存在永久存储体中,⼀般使⽤数据库表或⽂件来记录,实体类既包括存储和传递数据的类,还包括操作数据的类。

实体类来源于需求说明中的名词,如学⽣、商品等。

(2) 控制类:控制类⽤于体现应⽤程序的执⾏逻辑,提供相应的业务操作,将控制类抽象出来可以降低界⾯和数据库之间的耦合度。

控制类⼀般是由动宾结构的短语(动词+名词)转化来的名词,如增加商品对应有⼀个商品增加类,注册对应有⼀个⽤户注册类等(3) 边界类:边界类⽤于对外部⽤户与系统之间的交互对象进⾏抽象,主要包括界⾯类,如对话框、窗⼝、菜单等。

在⾯向对象分析和设计的初级阶段,通常⾸先识别出实体类,绘制初始类图,此时的类图也可称为领域模型,包括实体类及其它们之间的相互关系。

UML类图关系大全

UML类图关系大全

1、关联双向关联:C1-C2:指双方都知道对方的存在,都可以调用对方的公共属性和方法。

在 GOF的设计模式书上是这样描述的:虽然在分析阶段这种关系是适用的,但我们觉得它对于描述设计模式内的类关系来说显得太抽象了,因为在设计阶段关联关系必须被映射为对象引用或指针。

对象引用本身就是有向的,更适合表达我们所讨论的那种关系。

所以这种关系在设计的时候比较少用到,关联一般都是有向的。

使用ROSE 生成的代码是这样的:class C1...{public:C2* theC2;};class C2...{public:C1* theC1;};双向关联在代码的表现为双方都拥有对方的一个指针,当然也可以是引用或者是值。

单向关联:C3->C4:表示相识关系,指C3知道C4,C3可以调用C4的公共属性和方法。

没有生命期的依赖。

一般是表示为一种引用。

生成代码如下:class C3...{public:C4* theC4;};class C4...{};单向关联的代码就表现为C3有C4的指针,而C4对C3一无所知。

自身关联(反身关联):自己引用自己,带着一个自己的引用。

代码如下:class C14...{public:C14* theC14;};就是在自己的内部有着一个自身的引用。

2、聚合/组合当类之间有整体-部分关系的时候,我们就可以使用组合或者聚合。

聚合:表示C9聚合C10,但是C10可以离开C9而独立存在(独立存在的意思是在某个应用的问题域中这个类的存在有意义。

这句话怎么解,请看下面组合里的解释)。

代码如下:class C9...{public:C10 theC10;};class C10...{};组合(也有人称为包容):一般是实心菱形加实线箭头表示,如上图所示,表示的是C8被C7包容,而且C8不能离开C7而独立存在。

但这是视问题域而定的,例如在关心汽车的领域里,轮胎是一定要组合在汽车类中的,因为它离开了汽车就没有意义了。

UML类图详解

UML类图详解
第4章 UML类图
【学习目标】
· 定义类图 · 为什么要建模类图 · 类图的主要标记符号 · 如何建模类图
4.1 UML基本类图
面向对象设计的基础就是使用类。类是用来代表现实事务或 者功能的构造块。在本节中,我们将要学习如何建模类及其相互 之间的关系,以便在编写代码之前让你对系统拥有全面的认识。 类图是由若干类关联在一起,反映系统或者子系统组成结构的 静态图。类图的建模贯穿工程的分析和设计阶段的始终,通常从 商务伙伴能够理解的类开始建模,最终往往成为只有开发小组才 能够完全理解的类。
公司直销系统用例图
4.2 UML扩展类图
一、聚合和组合 在前面,已经介绍过类之间的简单关联,知道了它们在类图中 使用连接类的单线表示。本节将介绍如何更好地限定这些关联,其 方法是以聚合或者组合的形式来定义关联。这两种新的关联类型都 描述了类之间的整体——部分组成关系。 1.聚合 聚合用来描述两个类之间的整体——部分关系,其中一个类为 整体,它由一个或者多个部分类组成。在聚合中,部分类可以没有 整体类而存在。如下图所示。
三、学习如何建模类图 创建类图需要两个反复执行的步骤: 1)确定类及其关联。 2)确定属性和操作。 开始创建类图的好起点就是用例图。如下面成绩管理的用例图所 示。
1.确定类和关联 首先要做的是通过分析用例图确定类及其关联。找到第一批 类,确定它们的内容。 在用例图中,首先确定了Grades类和ReportCard类。接下来,通 过同时使用参与者名称确定附加的类。这时将会确定Teacher类, Student类和Administrator类。 下面检查用例图并且确定各个功能所属的类: 发布报告卡一Grades类 记录分数一Grades类 更新分数一Grades类 保存分数一Grades类 加载分数一Grades类 登录一? 查看分数一Grades类 生成报告卡一ReportCard类 首先发现的是登录没有所属的类。可以添加一个Logon类来处理 Logon用例。

如何画UML类图

如何画UML类图

如何画UML类图类1.1 作⽤域-表⽰private+表⽰public表⽰protected~表⽰default,包权限_下划线表⽰static,例如+getAge()斜体表⽰抽象1.2 属性表⽰属性名:数据类型name:String带默认值name:String='张三'1.3 ⽅法表⽰⽅法名(⽅法参数):返回值的数据类型getAge(name:String):Integer2 类与类之间的关系2.1 继承(泛化)介绍:指类与类之间的基础关系表⽰⽅法:⽤空三⾓形+实线表⽰,箭头指向⽗类2.2 实现介绍:指接⼝与类之间的实现关系表⽰⽅法:⽤空三⾓形+虚线表⽰,箭头指向接⼝2.3 依赖于关联2.3.1 依赖介绍:⼀个对象依赖于另⼀个对象才能完成它的⼯作表⽰⽅法:依赖关系⽤虚线箭头表⽰。

箭头指向被依赖的⼀⽅。

2.3.2 关联2.3.2.1单向关联介绍:关联(Association)关系是类与类之间最常⽤的⼀种关系,它是⼀种结构化关系,⽤于表⽰⼀类对象与另⼀类对象之间有联系,如汽车和轮胎、师傅和徒弟、班级和学⽣等等。

在UML类图中,⽤实线连接有关联关系的对象所对应的类,在使⽤Java、C#和C++等编程语⾔实现关联关系时,通常将⼀个类的对象作为另⼀个类的成员变量。

表⽰⽅法:实现箭头表⽰2.3.2.2 双向关联2.3.2.3 ⾃关联2.3.3 依赖与关联的区别1.发⽣依赖关系的两个类都不会增加属性。

其中的⼀个类作为另⼀个类的⽅法的参数或者返回值,或者是某个⽅法的变量⽽已。

2.发⽣关联关系的两个类,类A成为类B的属性,⽽属性是⼀种更为紧密的耦合,更为长久的持有关系。

从关系的⽣命周期来看,依赖关系是仅当类的⽅法被调⽤时⽽产⽣,伴随着⽅法的结束⽽结束。

关联关系当类实例化的时候产⽣,当类对象销毁的时候关系结束。

相⽐依赖,关联关系的⽣存期更长。

举例说明:我⽤锤⼦修了⼀下桌⼦,我和锤⼦之间就是⼀种依赖,我和我的同事就是⼀种关联。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

UML类图关系(泛化、继承、实现、依赖、关联、聚合、组合)继承、实现、依赖、关联、聚合、组合的联系与区别分别介绍这几种关系:继承指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系;在Java 中此类关系通过关键字extends明确标识,在设计时一般没有争议性;实现指的是一个class类实现interface接口(可以是多个)的功能;实现是类与接口之间最常见的关系;在Java中此类关系通过关键字implements明确标识,在设计时一般没有争议性;依赖可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、、临时性的、非常弱的,但是B类的变化会影响到A;比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖;表现在代码层面,为类B作为参数被类A在某个method方法中使用;关联他体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的、关联可以是单向、双向的;表现在代码层面,为被关联类B 以类属性的形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量;聚合聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;比如计算机与CPU、公司与员工的关系等;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;组合组合也是关联关系的一种特例,他体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合;他同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束;比如你和你的大脑;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;对于继承、实现这两种关系没多少疑问,他们体现的是一种类与类、或者类与接口间的纵向关系;其他的四者关系则体现的是类与类、或者类与接口间的引用、横向关系,是比较难区分的,有很多事物间的关系要想准备定位是很难的,前面也提到,这几种关系都是语义级别的,所以从代码层面并不能完全区分各种关系;但总的来说,后几种关系所表现的强弱程度依次为:组合>聚合>关联>依赖;聚合跟组合其实都属于关联只不过它们是两种特殊的关联因为本是同根生所以它们之间难免会有相似之处下面让我们一起来看一下它们之间有何不同聚合与组合的概念相信不用我在此赘述大家就已经了解了下面直接上例子程老师的《大话》里举大那个大雁的例子很贴切在此我就借用一下大雁喜欢热闹害怕孤独所以它们一直过着群居的生活这样就有了雁群每一只大雁都有自己的雁群每个雁群都有好多大雁大雁与雁群的这种关系就可以称之为聚合另外每只大雁都有两只翅膀大雁与雁翅的关系就叫做组合有此可见聚合的关系明显没有组合紧密大雁不会因为它们的群主将雁群解散而无法生存而雁翅就无法脱离大雁而单独生存——组合关系的类具有相同的生命周期聚合关系图:组合关系图:从从代码上看这两种关系的区别在于:构造函数不同雁群类:[csharp]view plaincopy1.public class GooseGroup2.{3.public Goose goose;4.5.6.public GooseGroup(Goose goose)7.{8.this.goose = goose;9.}10.}1.public class GooseGroup2.{3.public Goose goose;4.5.6.public GooseGroup(Goose goose)7.{8.this.goose = goose;9.}10.}大雁类:1.public class Goose2.{3.public Wings wings;4.5.public Goose()6.{7.wings=new Wings();8.}9.}1.public class Goose2.{3.public Wings wings;4.5.public Goose()6.{7.wings=new Wings();8.}9.}聚合关系的类里含有另一个类作为参数雁群类(GooseGroup)的构造函数中要用到大雁(Goose)作为参数把值传进来大雁类(Goose)可以脱离雁群类而独立存在组合关系的类里含有另一个类的实例化大雁类(Goose)在实例化之前一定要先实例化翅膀类(Wings)两个类紧密耦合在一起它们有相同的生命周期翅膀类(Wings)不可以脱离大雁类(Goose)而独立存在信息的封装性不同在聚合关系中,客户端可以同时了解雁群类和大雁类,因为他们都是独立的而在组合关系中,客户端只认识大雁类,根本就不知道翅膀类的存在,因为翅膀类被严密的封装在大雁类中。

-------------------------------------------------------------------------------------------------------UML-泛化、关联、聚合、组合、依赖一、泛化关系(generalization)1.说明表示类与类之间的继承关系,接口与接口之间的继承关系,或类对接口的实现关系。

一般化的关系是从子类指向父类的,与继承或实现的方法相反。

2.例图3.表现父类父类实例=new 子类();4.举例class Animal{};class Tigger : public Animal{};class Dog : public Animal{};Animal* pAnimal = new Dog;二、关联关系(association)1.说明对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时,这两个对象之间为关联关系。

表示类与类之间的联接,有双向关联和单向关联,双向关联有两个箭头或者没有箭头,单向关联有一个箭头,表示关联的方向。

关联关系以实例变量的形式存在,在每一个关联的端点,还可以有一个基数(multiplicity),表明这一端点的类可以有几个实例。

2.例图3.表现双向关联在代码的表现为双方都拥有对方的一个指针,当然也可以是引用或者是值。

关联关系是使用实例变量来实现。

4.举例//eg.1//单向关联class Person{};class Friend{Person* mpPerson;};//eg.2//双向关联class A;class B{A* pA;};class A{B* pB;};//eg.3//自身关联class C{C* pC;};三、聚合关系(aggregation)1.说明:关联关系的一种,是强的关联关系。

聚合是整体和个体的关系。

聚合关系也是通过实例变量实现的。

例如汽车、发动机、轮胎,一个汽车对象由一个发动机对象,四个轮胎对象组成。

当类之间有整体-部分关系的时候,我们就可以使用组合或者聚合。

2.例图3.表现与关联关系一样,聚合关系也是通过实例变量来实现这样关系的。

关联关系和聚合关系来语法上是没办法区分的,从语义上才能更好的区分两者的区别。

4.举例class CPU{};class Memory{};class Computer{CPU* mpCPU;Memory* mpMemory;};四、组合关系(合成关系)(composition)1.说明:合成关系也是关联关系的一种,是比聚合关系更强的关系。

合成关系是不能共享的。

例如人有四肢、头等。

表示类之间整体和部分的关系,组合关系中部分和整体具有统一的生存期。

一旦整体对象不存在,部分对象也将不存在。

部分对象与整体对象之间具有共生死的关系。

2.例图3.表现4.举例//同聚合关系,不过说语义不同class Leg{};class Arm{};class Person{Leg mLeg;Arm mArm;};五、依赖关系(Dependency)1.说明:对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。

与关联关系不同的是,依赖关系是以参数变量的形式传入到依赖类中的,依赖是单向的,要避免双向依赖。

一般来说,不应该存在双向依赖。

依赖是一种弱关联,只要一个类用到另一个类,但是和另一个类的关系不是太明显的时候(可以说是“uses”了那个类),就可以把这种关系看成是依赖。

2.例图3.表现依赖关系表现在局部变量,方法的参数,以及对静态方法的调用4.举例class Car{};class House{};class Person{void buy(Car& car){}void buy(House* pHouse){}};六、关系之间的区别1.聚合与组合(1)聚合与组合都是一种结合关系,只是额外具有整体-部分的意涵。

(2)部件的生命周期不同聚合关系中,整件不会拥有部件的生命周期,所以整件删除时,部件不会被删除。

再者,多个整件可以共享同一个部件。

组合关系中,整件拥有部件的生命周期,所以整件删除时,部件一定会跟着删除。

而且,多个整件不可以同时间共享同一个部件。

(3)聚合关系是“has-a”关系,组合关系是“contains-a”关系。

2.关联和聚合(1)表现在代码层面,和关联关系是一致的,只能从语义级别来区分。

(2)关联和聚合的区别主要在语义上,关联的两个对象之间一般是平等的,例如你是我的朋友,聚合则一般不是平等的。

(3)关联是一种结构化的关系,指一种对象和另一种对象有联系。

(4)关联和聚合是视问题域而定的,例如在关心汽车的领域里,轮胎是一定要组合在汽车类中的,因为它离开了汽车就没有意义了。

但是在卖轮胎的店铺业务里,就算轮胎离开了汽车,它也是有意义的,这就可以用聚合了。

3.关联和依赖(1)关联关系中,体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。

(2)依赖关系中,可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会影响到A。

4.综合比较这几种关系都是语义级别的,所以从代码层面并不能完全区分各种关系;但总的来说,后几种关系所表现的强弱程度依次为:组合>聚合>关联>依赖;-----------------------------------------------------------------------------------------------------------------------------------------------UML 线条箭头关系后面的例子将针对某个具体目的来独立地展示各种关系。

相关文档
最新文档