依赖、关联、聚合、组合、泛化讨论
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. }[csharp]view plaincopy1.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类图中的关系分为四种:泛化、依赖、关联、实现;关联关系⼜可以细化为聚合和组合。
⼀、泛化(Generalization)泛化是⽗类和⼦类之间的关系,⼦类继承⽗类的所有结构和⾏为。
在⼦类中可以增加新的结构和⾏为,也可以覆写⽗类的⾏为。
⼀般⽤⼀个带空⼼箭头的实线表⽰泛化关系,UML图如下:泛化对应Java中继承关系,即⼦类继承⽗类中出private修饰外的所有东西(变量、⽅法等)。
⽰例代码:public class Animal {}public class Tiger extends Animal {}Tiger继承Animal,因此Tiger与Animal之间是泛化(继承)关系。
这个很好理解。
⼆、依赖(Dependency)依赖关系是⼀种使⽤关系,特定事物的改变有可能会影响到使⽤该事物的事物,反之不成⽴。
在你想显⽰⼀个事物使⽤另⼀个事物时使⽤。
⼀般⽤⼀条指向被依赖事物的虚线表⽰,UML图如下:通常情况下,依赖关系体现在某个类的⽅法使⽤另⼀个类作为参数。
代码⽰例:public class Screwdriver { //螺丝⼑,作为⼈类的⼯具,是⽤来被⼈类使⽤的}public class Person{public void screw(Screwdriver src){ //拧螺丝,需使⽤螺丝⼑}}Person类的screw()⽅法在使⽤时就得传⼊⼀个Screwdriver类型的参数,这样Screwdriver的改变就会影响到Person,因此Person与Screwdriver之间就是依赖关系(Person依赖于Screwdriver)。
三、关联(Association)是⼀种结构关系,说明⼀个事物的对象与另⼀个事物的对象相联系。
给定有关联的两个类,可以从⼀个类的对象得到另⼀个类的对象。
关联有两元关系和多元关系。
两元关系是指⼀种⼀对⼀的关系,多元关系是⼀对多或多对⼀的关系。
UML 之 C++类图关系全面剖析
UML 之 C++类图关系全面剖析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图中类之间的关系:依赖,泛化,关联,聚合,组合,实现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中关系在visio中的表示
Uml 关系主要有四大类:依赖,关联,泛化,实现。
其中依赖和关联是事物之间语义上的横向关系,泛化和实现是事物之间的纵向关系。
一:依赖Dependency图示:----->定义:关系最为松散的,单向的,暂时产生关系的事物之间使用。
使用图例:在静态图、组件图、部署图中两事物的弱依赖关系用此图示。
二:关联Association图示:此图为visio中画法(在uml静态结构中,拖动复合图例,然后双击此图例,将出现下图,在关联端list中,聚合列都选择无,然后在isNavigable列中选择划箭头的端。
然后点选确定,就出现右侧的关联图例)。
定义:两事物之间的比较密切关系。
实体之间的一个结构化关系表明对象是相互连接的。
箭头是可选的,它用于指定导航能力。
如果没有箭头,暗示是一种双向的导航能力。
关联转换为一个实例作用域的变量。
可为一个关联附加其他修饰符。
多重性(Multiplicity)修饰符暗示着实例之间的关系。
使用图例:在静态图中使用,其他图中也有类似的关联关系,但细化为其他关系。
其中具体细分了两种关系:聚合和组合。
1聚合Aggregation图示:此图为visio中画法(在uml静态结构中,拖动复合图例,然后双击此图例,将出现下图,在关联端list中,在聚合列中在需划箭头端选择共享选项。
然后点选确定,就出现左侧的聚合图例)。
定义:整体和个体之间的关系,个体生命周期的消亡对整体生命周期没有太大的影响。
has a的关系。
聚合是关联的一种形式,代表两个类之间的整体/局部关系。
聚合暗示着整体在概念上处于比局部更高的一个级别,而关联暗示两个类在概念上位于相同的级别。
聚合也转换成一个实例作用域变量。
关联和聚合的区别纯粹是概念上的,而且严格反映在语义上。
聚合还暗示着实例图中不存在回路。
换言之,只能是一种单向关系。
2组合Composition图示:此图为visio中画法(在uml静态结构中,直接拖动复合图例)定义:整体和个体之间的关系,contains a 的关系。
类的五种关系 泛化聚合关联等应注意的问题和练习
表示属性约束说明: 例如: #visibility:Boolean=false{读写} 表示属性”visibility”可读,写
武当山旅游门户网站( ) 分类信息
问题:
?
1、指出下面属性名的含义。
武当山旅游门户网站( ) 分类信息
类的操作
1. 操作的含义 操作(operation): 描述类所表示事物的动态性质。 2.操作的格式 [可见性]操作名[(参数列表):返回类型][{特性}]
该操作对外部实体的显现程度. 可见public : + 受限protected: # 私有private : -
关联可以分为单向关联,双向关联。
单向关联
双向关联
武当山旅游门户网站( ) 分类信息
2.关联的特性
① 关联名
关联名
★如果关联关系已经清楚,就无需关联名
武当山旅游门户网站( ) 分类信息
2.关联的特性 ② 关联的角色
关联的角色
★如果关联名与角色名相同,则不标出角色名
类的概念
1. 类的定义 类(class): 具有相似结构、行为和关系的一组对象。 2.类的表示
类名
属性
操作
武当山旅游门户网站( ) 分类信息
类的其他几种表示形式
① 简化表示
② 缩略表示
实站( ) 分类信息
该属性对外部实体的显现程度. 可见public : + 受限protected: # 私有private : -
武当山旅游门户网站( ) 分类信息
类的属性
1. 属性的含义 属性(attribute): 描述类所表示事物的静态性质。 2.属性的格式
uml关系箭头
UML类图符号各种关系说明以及举例UML中描述对象和类之间相互关系的方式包括:依赖(Dependency),关联(Association),聚合(Aggregation),组合(Composition),泛化(Generalization),实现(Realization)等。
•依赖(Dependency):元素A的变化会影响元素B,但反之不成立,那么B和A的关系是依赖关系,B依赖A;类属关系和实现关系在语义上讲也是依赖关系,但由于其有更特殊的用途,所以被单独描述。
uml中用带箭头的虚线表示Dependency关系,箭头指向被依赖元素。
•泛化(Generalization):通常所说的继承(特殊个体 is kind of 一般个体)关系,不必多解释了。
uml中用带空心箭头的实线线表示Generalization关系,箭头指向一般个体。
•实现(Realize):元素A定义一个约定,元素B实现这个约定,则B和A的关系是Realize,B realize A。
这个关系最常用于接口。
uml中用空心箭头和虚线表示Realize关系,箭头指向定义约定的元素。
•关联(Association):元素间的结构化关系,是一种弱关系,被关联的元素间通常可以被独立的考虑。
uml中用实线表示Association关系,箭头指向被依赖元素。
•聚合(Aggregation):关联关系的一种特例,表示部分和整体(整体 hasa 部分)的关系。
uml中用带空心菱形头的实线表示Aggregation关系,菱形头指向整体。
•组合(Composition):组合是聚合关系的变种,表示元素间更强的组合关系。
如果是组合关系,如果整体被破坏则个体一定会被破坏,而聚合的个体则可能是被多个整体所共享的,不一定会随着某个整体的破坏而被破坏。
uml中用带实心菱形头的实线表示Composition关系,菱形头指向整体。
其中依赖(Dependency)的关系最弱,而关联(Association),聚合(Aggregation),组合(Composition)表示的关系依次增强。
关联--依赖、组合--聚合 联系与区别
关联和聚合的区别主要在语义上,关联的两个对象之间一般是平等的,例如你是我的朋友,聚合则一般不是平等的,例如一个公司包含了很多员工,其实现上是差不多的。聚合和组合的区别则在语义和实现上都有差别,组合的两个对象之间其生命期有很大的关联,被组合的对象是在组合对象创建的同时或者创建之后创建,在组合对象销毁之前销毁。一般来说被组合对象不能脱离组合对象独立存在,而且也只能属于一个组合对象,例如一个文档的版本,必须依赖于文档的存在,也只能属于一个文档。聚合则不一样,被聚合的对象可以属于多个聚合对象,例如一个员工可能可以属于多个公司。
----------------------------------------------------------------------------------------------------------------------------------
聚合:指的是整体与部分的关系。通常在定义一个整体类后,再去分析这个整体类的组成结构。从而找出一些组成类,该整体类和组成类之间就形成了聚合关系。例如一个航母编队包括海空母舰、驱护舰艇、舰载飞机及核动力攻击潜艇等。需求描述中“包含”、“组成”、“分为…部分”等词常意味着聚合关系。
聚合中的被包含对象可以没有。 而组合至少有一个。聚合是一种拥有的关系,而组合是整体与部分的关系
举一个简单的例子:
一个图书馆可以有十万本书,也可以一本也没有。但空的图书馆还是图书馆。这是聚合
一个车(我们平常能看到的普通的交通工具车)有轮子,有的车是四轮子的,有的车是三轮的,自行车是二轮的,还有独轮车,但车至少要有一个轮子,不然就不是车。这是组合关系。
同构性,主体和部分不具有生命期的一致性
课程组可由多个学生组成,课程组撤消了,学生还活得好好的,这是聚合。
类图的六种关系
类图的六种关系类图是一种图形表达方式,用于描述类、对象和它们之间的关系。
一般来说,类图有六种关系,分别是继承关系、实现关系、关联关系、聚合关系、依赖关系和泛化关系。
首先,继承关系是指一个类从另一个类继承的关系。
这种关系有两个方面:父类和子类。
父类是被继承的类,也称为基类;子类是从父类继承而来的类,也称为派生类。
子类可以获得父类的特性,并且可以为其添加新的特性。
其次,实现关系表示一个类实现一个接口。
实现关系可以分为两个方面:接口和实现类。
接口是一组公共方法,该接口定义了一系列功能,但没有实现具体功能;而实现类则是实现接口中所有功能的类。
实现关系可以让多个对象共享接口中的定义,从而减少代码的重复编写。
再次,关联关系是指类之间的相互关系。
关联关系有两种形式:一种是单项关联,另一种是双向关联。
单项关联是指一个类将另一个类作为自己的一部分,而另一个类则不会将这个类作为自己的一部分;双向关联则是指两个类彼此拥有对方的实例。
关联关系也可以分为强关联和弱关联。
强关联意味着两个实例中的一个必须存在,而弱关联则表示两个实例间的关联可以不存在。
第四,聚合关系也是一种关联关系,它表示一个对象可以包含多个相关对象,但是这些对象不会因另一个对象的状态改变而改变。
这种关系可以分为三种类型:单点聚合、集合聚合和组合聚合。
单点聚合表示一个类可以包含一个成员,而集合聚合则表示一个类可以包含多个成员;组合聚合则表示一个类可以包含一组元素,这些元素可以是另外一个类或一组其他对象的集合。
第五,依赖关系是一种类与类之间的关系,它表示一个类依赖于另一个类,以完成其功能。
这种关系分为两种类型:强依赖和弱依赖。
强依赖是指一个类必须依赖另一个类,以完成其功能;而弱依赖则是指一个类可以选择依赖另一个类,但不是必须依赖另一个类。
最后,泛化关系是指一个类从另一个类继承而来的关系。
这种关系有两个方面:抽象类和具体类。
抽象类是一种属性和行为的集合,由此可以派生出具体类;而具体类则是从抽象类继承而来的类,它们可以继承抽象类的属性和行为,并且可以添加新的属性和行为。
Java类之间的关联关系
Java类之间的关联关系UML类图中的关系分为四种:泛化、依赖、关联、实现;关联关系又可以细化为聚合和组合。
一、泛化(Generalization)泛化是父类和子类之间的关系,子类继承父类的所有结构和行为。
在子类中可以增加新的结构和行为,也可以覆写父类的行为。
一般用一个带空心箭头的实线表示泛化关系,UML图如下:泛化对应Java中继承关系,即子类继承父类中出private修饰外的所有东西(变量、方法等)。
示例代码:public class Animal {}public class Tiger extends Animal {}Tiger继承Animal,因此Tiger与Animal之间是泛化(继承)关系。
这个很好理解。
二、依赖(Dependency)依赖关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的事物,反之不成立。
在你想显示一个事物使用另一个事物时使用。
一般用一条指向被依赖事物的虚线表示,UML图如下:通常情况下,依赖关系体现在某个类的方法使用另一个类作为参数。
代码示例:public class Screwdriver { //螺丝刀,作为人类的工具,是用来被人类使用的}public class Person{public void screw(Screwdriver src){ //拧螺丝,需使用螺丝刀}}Person类的screw()方法在使用时就得传入一个Screwdriver类型的参数,这样Screwdriver的改变就会影响到Person,因此Person与Screwdriver之间就是依赖关系(Person依赖于Screwdriver)。
三、关联(Association)是一种结构关系,说明一个事物的对象与另一个事物的对象相联系。
给定有关联的两个类,可以从一个类的对象得到另一个类的对象。
关联有两元关系和多元关系。
两元关系是指一种一对一的关系,多元关系是一对多或多对一的关系。
依赖、关联、聚合、组合、泛化讨论
依赖、关联、聚合、组合、泛化讨论类之间有依赖、关联、聚合、组合、泛化五种关系。
依赖关系表示一个类依赖于另一个类的定义,其中一个类的变化将影响另外一个类。
这种依赖关系是一种使用关系(use a),具有偶然性、临时性,关系非常弱,但被依赖类的变化会影响到使用它的类,比如某人过河需要一条船,此时人与船之间的关系就是依赖。
在代码中表现为函数中的参数。
如果A依赖于B,则B体现为局部变量,方法的参数、或静态方法的调用。
如图1所示。
图1 依赖关系关联关系是类与类之间的联接,体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友,这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。
表现为拥有关系(has a ),如果A拥有B,则B 是A的全局变量,它使一个类知道另一个类的属性和方法。
关联关系有双向关联和单向关联。
双向关联:两个类彼此知道另一个类的公共属性和操作。
单向关联:只有一个类知道另外一个类的公共属性和操作。
大多数关联应该是单向的,单向关系更容易建立和维护,有助于寻找可复用的类。
如图2所示。
聚合关系是关联关系的一种,是强的关联关系。
聚合关系是整体和个体的关系。
普通关联关系的两个类处于同一层次上,而聚合关系的两个类处于不同的层次,一个是整体,一个是部分。
聚合关系是一种弱的“拥有”关系,体现的是A 对象可以包含B 对象,但B 对象不是A 对象的组成部分。
如果A 由B 聚合而成,表现为A 包含有B 的全局对象,但是B 对象可以不在A 创建的时刻创建。
如图3所示。
组合关系是关联关系的一种,是比聚合关系强的关系。
它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。
组合关系是一种强的“拥有”关系,体现了严格的部分和整体的关系,部分和整体的生命周期一致。
如果A 由B 组成,表现为A 包含有B 的全局对象,并且B 对象在A 创建的时刻创建。
依赖关系、关联关系、聚合关系、组合关系、泛化关系和实现关系
依赖关系、关联关系、聚合关系、组合关系、泛化关系和实现
关系
依赖关系:表示一个类的变化会影响另一个类,但两个类之间并不存在拥有和共享的关系。
类之间通过参数传递、方法调用等方式产生依赖关系。
关联关系:表示两个类之间的联系,强调的是它们之间的共享。
关联关系可以是单向的或双向的,可以是一对一的、一对多的或多对多的。
聚合关系:表示整体与部分之间的关系,整体对象拥有部分对象,但部分对象不是整体对象的一部分。
聚合关系是一种弱关联关系,两个对象的生命周期可以独立。
组合关系:也表示整体与部分之间的关系,但部分对象是整体对象的一部分,没有它们整体对象就无法存在。
组合关系是一种强关联关系,两个对象的生命周期是相互依赖的。
泛化关系:表示一个类是另一个类的特殊形式,继承关系的表示方式之一。
泛化关系体现了一种继承和特化的关系,子类继承了父类的属性和方法,并可以进行扩展和覆盖。
实现关系:表示一个类实现了一个接口,接口可以定义一组规范,类需要实现这些规范中定义的方法。
实现关系实现了一种接口或协议,在面向对象的编程中强调了一种规范和标准的约定。
类图由类及类与类之间的关系组成常有关联泛化继承
例如,在自动售货机系统中,张三投入硬币购 买矿泉水,系统收到钱后把矿泉水送出来,上述过 程就是一个脚本;李四投币买可乐,但是可乐已卖 完了,于是系统给出提示信息并把钱退还给李四, 这个过程是另一个脚本。 3. 行为者(Actor) 行为者是指与系统交互的人或其他系统,它代 表外部实体。使用用例并且与系统交互的任何人或 物都是行为者。 行为者代表一种角色,而不是某个具体的人或 物。事实上,一个具体的人可以充当多种不同角色。
状态图中两个状态之间带箭头的连线称为状态 转换,箭头指明了转换方向。状态变迁通常是由事 件触发的,在这种情况下应在表示状态转换的箭头 线上标出触发转换的事件表达式;如果在箭头线上 未标明事件,则表示在源状态的内部活动执行完之 后自动触发转换。
事件表达式的语法如下: 事件说明[守卫条件]/动作表达式 事件说明的语法为:事件名(参数表)。 守卫条件是一个布尔表达式。如果同时使用事 件说明和守卫条件,则当且仅当事件发生且布尔表 达式为真时,状态转换才发生。如果只有守卫条件 没有事件说明,则只要守卫条件为真状态转换就发 生。 动作表达式是一个过程表达式,当状态转换开 始时执行该表达式。 图3.3给出了状态图中使用的主要符号。
9.6.1 用例图(Use-Case Diagram)
UML提供的用例图也是进行需求分析和建立功能模型 的强有力工具,称为用例模型。它描述了开发者和用户对 需求规格所达成的共识。 模型元素有系统、行为者、用例及用例之间的关系。 图9.17是自动售货机系统的用例图。 1. 系统(System) 系统被看作是一个提供用例的黑盒子,内部如何工作、 用例如何实现,这些对于建立用例模型来说都是不重要的。 代表系统的方框的边线表示系统的边界,用于划定系 统的功能范围,定义了系统所具有的功能。描述该系统功 能的用例置于方框内,代表外部实体的行为者置于方框外。
UML中的四种关系总结
UML中的四种关系总结UML中的关系主要包含四种:关联关系、依赖关系、泛化关系、实现关系。
当中关联关系还包含聚合关系和组合关系。
1、关联关系(Association)关联关系式⼀种结构化的关系,是指⼀种对象和还有⼀种对象有联系。
给定关联的两个类。
能够从当中的⼀个类的对象訪问到还有⼀个类的相关对象。
关联关系⽤⼀条实线表⽰。
演⽰样例1.1、聚合关系(Aggregation)聚合是关联的特例。
聚合是表⽰总体与部分的关系,即has a 关系。
聚合关系中的总体和部分是能够分离的,他们能够具有各⾃的⽣命周期,部分能够数据多个总体对象。
演⽰样例1.2、组合关系(Composition)组合关系式关联关系的⼀种特例。
他体现的是⼀种contains a的关系。
这样的关系⽐聚合更强。
它相同也体现了总体与部分的关系。
此时总体与部分是不可分的,总体的⽣命周期结束也就意味着部分的⽣命周期结束。
演⽰样例`2、依赖关系(Dependency)依赖关系式类与类之间的连接,表⽰⼀个类依赖于还有⼀个类的定义。
当中⼀个类元素是独⽴的,还有⼀个类元素不是独⽴的,它依赖与独⽴的那个类。
假设独⽴的类改变,将影响依赖与它的那个类。
演⽰样例3、泛化关系(Generalization)泛化关系式⼀个类(⼦类、⼦接⼝)继承另外⼀个类(⽗类、⽗接⼝)的功能。
⼦类还能够添加⾃⼰的新功能。
继承是类与类或者接⼝与⼏⼝之间最常见的关系之中的⼀个。
4、实现关系(Realization)实现关系指的是⼀个class类实现interface接⼝(能够是多个)的功能;实现是类与接⼝之间最常见的关系。
演⽰样例:⽐較聚合关系VS组合关系组合跟聚合差点⼉同样,唯⼀差别就是“部分”不能脱离“总体”⽽单独存在。
关联关系VS聚合关系关联关系中两个类是出于同样的层次。
⽽聚合关系中两个类是出于不平等的层次,⼀个表⽰总体,⼀个表⽰部分。
uml 中的六大关系详解
uml 中的六大关系详解
UML(Unified Modeling Language)中的六大关系详解如下:
1. 依赖(Dependency):这是一种使用的关系,表示一个类需要另一个类的协助。
依赖关系通常表示为一个单向箭头,指向被依赖的类。
依赖关系是临时的,通常只在某个特定的时间点存在。
2. 泛化(Generalization):泛化是一种继承关系,表示一般与特殊之间的关系。
它规定了子类如何特化父类的特征和行为。
在UML中,泛化关系用一条带空心三角形的实线表示,三角形指向父类。
3. 实现(Realization):实现关系是类与接口的关系,表示类是接口所有特征行为的实现。
它的表示方法是带有三角箭头的虚线,箭头指向接口。
4. 关联(Association):关联是一种拥有关系,使一个类知道另一个类的属性和方法。
关联关系通常表示为一条实线,表示两个类之间的连接。
关联可以是双向的或单向的。
5. 聚合(Aggregation):聚合是整体与部分之间的关系,且部分可以离开整体而单独存在。
聚合关系通常表示为一条带空心菱形的实线,菱形指向整体。
6. 组合(Composition):组合也是整体与部分的关系,但是部分不能离开整体。
组合关系通常表示为一条带实心菱形的实线,菱形指向整体。
这些关系是UML的核心概念,理解和正确使用这些关系是掌握和应用UML 的关键。
依赖、关联、聚合、组合
你是我的玫瑰-类关系阐微世界是普遍联系的,因此程序世界中的类,也不可能是孤立的。
UML为我们定义了它们之间的关系,就是:依赖、关联、聚合、组合还有泛化。
泛化关系比较好理解,就是表示类之间的继承关系。
容易混淆的是依赖、关联、聚合和组合的关系。
这里做一些甄别:1、依赖和关联的颠倒颠在网上查找了一下依赖和关联的区别,有说“关联本身即是一种依赖”,亦有说“依赖是一种弱关联”,其实说来说去是一档子事。
依赖和关联都是说一个类用到了另一个类。
其区别在于一个是使用,一个是拥有。
依赖:具有某种偶然性。
比如说我要过河,没有桥怎么办,我就去借来一条小船渡过去。
我与小船的关系仅仅是使用(借用)的关系。
表现在代码上,为依赖的类的某个方法以被依赖的类作为其参数。
或者是class A 的某个方法创造了class B 的实例抑或对class B的静态方法的调用。
如果A依赖于B,那意味着B的变化可能要求A也发生变化;这是uml图表示的依赖关系:代码表现:1public class Person{2/** 划船 */3public void oarage (Boat boat){4 boat.oarage();5 }6}7关联:有名的客户和订单的关系以及公司和员工的关系,都是关联关系。
还有就是我和我的单车的例子,他们都是一种“拥有”的关系。
表现在代码上,就是一个类包含另一个类的实例,通常表现为被关联类以类属性的形式出现在关联类的类定义中,也可以表现为关联类引用了一个类型为被关联类的全局变量。
关联可以使单向的,也可以使双向的。
从网上找到的公司和员工的UML图和代码:公司和员工的关联关系1public class Company{2private Employee employee;3public Employee getEmployee(){4return employee;5 }6public void setEmployee(Employee employee){7this.employee=employee;8 }9//公司运作10public void run(){11 employee.startWorking();12 }13}14可见依赖于与关联亦有动静之别,关联的类“静态”地引用了被关联类的实例变量,而依赖的偶然性也正说明了它的动态性。
类与类之间的关系-依赖-关联-聚合-组合
类与类之间的关系-依赖-关联-聚合-组合1)依赖依赖关系是类与类之间的联接。
⼀个类依赖于另⼀个类的定义。
如,⼀个⼈(Person)可以买车(Car)和房⼦(House),Person类依赖于Car和House的定义,因为Person引⼊了Car和House。
与关联不同的是,Person类中没有Car和House的属性,Car和House的实例是以参量的⽅式传⼊到buy()⽅法中的。
⼀般⽽⾔,依赖关系在Java语⾔中体现为局部变量,⽅法形参,或者对静态⽅法的调⽤。
2)关联关联是类与类之间的联接,使⼀个类知道另⼀个类的属性和⽅法。
关联可以是双向,也可以是单向的。
⼀般使⽤成员变量来实现。
3)聚合聚合是⼀种强的关联关系。
是整体和个体之间的关系。
例如,汽车类与引擎类,轮胎类之间的关系就是整体与个体之间的关系。
与关联关系⼀样,聚合关系也是通过实例变量实现的。
但是关联关系涉及的两个类在同⼀层次,⽽聚合关系中两个类处在不平等的层次上,⼀个代表整体,⼀个代表部分。
4)组合组合也是关联关系的⼀种,⼀种⽐聚合关系强的关系。
组合关系中的部分类不能独⽴于整体类存在。
整体类和部分类有相同的⽣命周期。
如Person类和Leg类。
5)继承/泛化泛化和继承其实是⼀个逆过程泛化就是有⼦类抽象出⼀个⽗类⽽继承就是由⽗类具体化⼀个⼦类例如⾜球⽐联赛跟什么西甲意甲英超之间就是泛化/继承的关系6)组合和聚合的区别组合和聚合都属于关联,所以它们之间难免有相似之处,区别举例来说明:程⽼师的《⼤话》⾥举⼤那个⼤雁的例⼦很贴切在此我就借⽤⼀下⼤雁喜欢热闹害怕孤独所以它们⼀直过着群居的⽣活这样就有了雁群每⼀只⼤雁都有⾃⼰的雁群每个雁群都有好多⼤雁⼤雁与雁群的这种关系就可以称之为聚合另外每只⼤雁都有两只翅膀⼤雁与雁翅的关系就叫做组合有此可见聚合的关系明显没有组合紧密⼤雁不会因为它们的群主将雁群解散⽽⽆法⽣存⽽雁翅就⽆法脱离⼤雁⽽单独⽣存——组合关系的类具有相同的⽣命周期聚合关系图:组合关系图:。
UML类图(下):关联、聚合、组合、依赖
UML类图(下):关联、聚合、组合、依赖前⾔上⼀篇⽂章,讲了UML类图中类、继承、实现三种关系及其在UML类图中的画法,本⽂将接着上⽂的内容,继续讲讲对象之间的其他⼏种关系,主要就是关联、聚合、组合、依赖,下⾯开始⽂章的内容。
注意1:⼦类中覆盖了⽗类的abstract⽅法,⽅法名再次出现。
注意2:⽆论哪种关系,箭头指向被依赖⽅。
关联关系关联(Assocition)关系是类与类之间最常见的⼀种关系,它是⼀种结构化的关系,表⽰⼀类对象与另⼀类对象之间有联系,如汽车和轮胎、师傅和徒弟、班级和学⽣等。
在UML类图中,⽤实线连接有关联关系的对象所对应的类,在Java中通常将⼀个类的对象作为另⼀个类的成员变量。
关联关系分单向关联、双向关联、⾃关联,逐⼀看⼀下。
1、单向关联关系单向关联指的是关联只有⼀个⽅向,⽐如顾客(Customer)拥有地址(Address),其Java实现为:public class Address{}public class Customer{private Address address;}UML的画法为:2、双向关联关系默认情况下的关联都是双向的,⽐如顾客(Customer)购买商品(Product),反之,卖出去的商品总是与某个顾客与之相关联,这就是双向关联。
Java类的写法为:public class Product{private Customer customer;}public class Customer{private Product[] product;}对应的UML类图应当是:3、⾃关联关系⾃关联,指的就是对象中的属性为对象本⾝,这在链表中⾮常常见,单向链表Node中会维护⼀个它的前驱Node,双向链表Node中会维护⼀个它的前驱Node和⼀个它的后继Node。
就以单向链表为例,它的Java写法为:public class Node{private Node nextNode;}对应的UML类图应当是:聚合关系聚合(Aggregation)关系表⽰整体与部分的关系。
类与类之间的关系--泛化,关联,依赖,实现
类与类之间的关系--泛化,关联,依赖,实现类,对象是⾯向对象的基础,类与类之间的关系是⾯向对象不可或缺的⼀部分。
以下将从类的关系定义,UML中的符号表⽰,代码实现三⽅⾯介绍类与类之间的关系。
1、泛化(Generalization):也成为继承关系。
指⼀个类(⼦类或者⼦接⼝)继承另外⼀个类(⽗类或者⽗接⼝)的功能。
并能够添加⾃⼰的功能。
在程序程序中⽤keywordextends明⽩标识,在UML设计中⽤空三⾓和实线表⽰。
从⼦类指向⽗类。
或者⼦接⼝指向⽗接⼝。
如图代码:public class Cat {public Cat(){}public void Eat(){}public void Run(){}public void Walk(){}}⼦类演⽰样例public class WhiteCat extends Cat {public WhiteCat(){}public void Eat(){}public void Run(){}public void Walk(){}}2、实现(Realize)是指⼀个class 实现interface接⼝的功能,⽤keywordimplements标识。
在UML设计中⽤⼀条带空⼼箭头的虚线表⽰,箭头指向接⼝。
如图代码:public interface Iaction {public void drink();public void eat();}public class dog implements Iaction {public dog(){}public void finalize() throws Throwable {}public void drink(){}public void eat(){}}3、依赖(Dependency)是指⼀个类A使⽤到了还有⼀个类B,⽽这样的使⽤关系是具有偶然性、暂时性。
可是类B的变化会影响到类A。
表如今代码层⾯,为类B作为參数被类A在某个⽅法中使⽤。
C# uml图
C# UML类图UML类图有关联、聚合/组合、依赖、泛化(继承,实现)这样几种关系。
事实上关联、聚合/组合这几种关系很容易搞混。
比如图1.1在PowerDesigner中生成的代码都是一样的。
图1.1而什么时候使用关联,聚合/组合呢?1、关联当Class_A与Class_B有一种关系时使用,比如父子关系。
2、聚合/组合当Class_A与Class_B有包含关系,是has a的情况使用。
具体看如果Class_A 包含Class_B,而Class_A知道Class_B的生命周期,那就用组合;如果有包含关系却不知道生命周期,那就用聚合。
图1.2如图1.2,父亲(Father)让儿子(Son)去做一些事情,这就是关联。
而人(Person)有一个脑袋(Head),人死了,脑袋自然没用了,这就用组合。
电脑(Computer)有条内存,现在电脑坏掉了,但是内存还能用,这就是聚合。
反映成代码就是:1、关联public class Son{public void DoSomething() {}}public class Father{public Son son;public Father(Son son){this.son = son;}public void LetSonTodo() {son.DoSomething();}}2、组合public class Head{public void Think(){}}public class Person{public Head head;public Person(){head = new Head();}public void Think(){head.Think();}}3、聚合public class Memory{}public class Computer{public Memory memory;public Computer(Memory memory) {this.memory = memory;}}在C#中依赖也有特点。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
依赖、关联、聚合、组合、泛化讨论
类之间有依赖、关联、聚合、组合、泛化五种关系。
依赖关系表示一个类依赖于另一个类的定义,其中一个类的变化将影响另外一个类。
这种依赖关系是一种使用关系(use a),具有偶然性、临时性,关系非常弱,但被依赖类的变化会影响到使用它的类,比如某人过河需要一条船,此时人与船之间的关系就是依赖。
在代码中表现为函数中的参数。
如果A依赖于B,则B体现为局部变量,方法的参数、或静态方法的调用。
如图1所示。
图1 依赖关系
关联关系是类与类之间的联接,体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友,这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。
表现为拥有关系(has a ),如果A拥有B,则B 是A的全局变量,它使一个类知道另一个类的属性和方法。
关联关系有双向关联和单向关联。
双向关联:两个类彼此知道另一个类的公共属性和操作。
单向关联:只有一个类知道另外一个类的公共属性和操作。
大多数关联应该是单向的,单向关系更容易建立和维护,有助于寻找可复用的类。
如图2所示。
聚合关系是关联关系的一种,是强的关联关系。
聚合关系是整体和个体的关系。
普通关联关系的两个类处于同一层次上,而聚合关系的两个类处于不同的层次,一个是整体,一个是部分。
聚合关系是一种弱的“拥有”关系,体现的是A 对象可以包含B 对象,但B 对象不是A 对象的组成部分。
如果A 由B 聚合而成,表现为A 包含有B 的全局对象,但是B 对象可以不在A 创建的时刻创建。
如图3所示。
组合关系是关联关系的一种,是比聚合关系强的关系。
它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。
组合关系是一种强的“拥有”关系,体现了严格的部分和整体的关系,部分和整体的生命周期一致。
如果A 由B 组成,表现为A 包含有B 的全局对象,并且B 对象在A 创建的时刻创建。
如图4所示。
图2 关联关系 图3 聚合关系
图4 组合关系
泛化关系表现为继承和实现关系(is a),具体形式为类与类之间的继承关系,接口与接口之间的继承关系,类对接口的实现关系。
如图5所示。
图5 泛化关系
总结:对于泛化关系没多少疑问,他们体现的是一种类与类、或者类与接口间的纵向关系,其它的四者关系则体现的是类与类、或者类与接口间的引用、横向关系,都是语义级别的所以比较难区分的,从代码层面并不能完全区分各种关系,但总的来说,后4种关系所表现的强弱程度依次为:组合>聚合>关联>依赖。
组合与聚合属于特殊的关联关系。