关联--依赖、组合--聚合 联系与区别
- 格式:doc
- 大小:28.00 KB
- 文档页数:3
语言学纲要组合关系和聚合关系组合关系和聚合关系是软件工程中常用的两种关系。
本文将从定义、特点、应用场景等方面介绍这两种关系的概念和区别。
一、组合关系组合关系是指一个整体由多个部分组成的关系,整体和部分之间具有紧密的关联。
在组合关系中,整体对象拥有部分对象,部分对象只能属于一个整体对象。
组合关系的特点:1. 整体对象拥有部分对象,整体对象的生命周期决定了部分对象的生命周期。
2. 部分对象不能独立存在,必须依附于整体对象。
3. 整体对象和部分对象之间是强关联,一起共同完成某个功能。
组合关系的应用场景:1. 树形结构:树是典型的组合关系,根节点是整体对象,子节点是部分对象。
2. GUI界面设计:界面中的控件可以作为整体对象,而控件的各个元素可以作为部分对象。
3. 企业组织架构:公司可以作为整体对象,员工可以作为部分对象。
二、聚合关系聚合关系是指一个整体由多个部分组成的关系,整体和部分之间的关联较弱。
在聚合关系中,整体对象拥有部分对象,但部分对象可以独立存在。
聚合关系的特点:1. 整体对象拥有部分对象,但部分对象可以脱离整体对象而存在。
2. 部分对象可以属于多个整体对象,具有更大的灵活性。
3. 整体对象和部分对象之间是弱关联,可以独立进行操作。
聚合关系的应用场景:1. 学校和学生:学校是整体对象,学生是部分对象,学生可以选择加入不同的学校。
2. 车辆和引擎:车辆是整体对象,引擎是部分对象,引擎可以被多个车辆使用。
3. 图书馆和图书:图书馆是整体对象,图书是部分对象,图书可以被借阅、归还、购买等。
三、组合关系和聚合关系的区别1. 生命周期:组合关系中,整体对象的生命周期决定了部分对象的生命周期;而在聚合关系中,部分对象可以独立存在。
2. 关联性:组合关系中,整体对象和部分对象之间的关联较强;而在聚合关系中,整体对象和部分对象之间的关联较弱。
3. 灵活性:组合关系中,部分对象只能属于一个整体对象;而在聚合关系中,部分对象可以属于多个整体对象。
uml复习题1.⽤例的extend和include之间的区别是什么Extend指通过附件⾏为获取其他⽤例来扩展当前⽤例。
如果初始迭代实线的⽤例功能,在后续迭代有所改进,那么就存在⽤例扩展关系。
Include指⼀个⽤例功能包含在另⼀个⽤例功能之内。
当另⼀个⽤例要求⼀个⽤例的功能时,那么就存在⽤例包含关系。
2.关联中的组合和聚合之间的区别是什么聚合关系反映了⼀个对象是另⼀个对象的⼀部分,或者说表明了⼀个对象是由若⼲个其他对象组成的。
组合关系描述部分对象依赖于整体对象,这种依赖关系通过如下两种⽅式表现出来:⾸先,在任⼀给定时刻,⼀个部分对象只能属于⼀个组合对象;其次,当⼀个组合对象被撤销时,所有依赖于这个组合对象的部分对象都将同时被撤销。
3.抽象类和接⼝之间的区别是什么接⼝是您能实现多继承,因为类能够实线多个接⼝。
但是,抽象类不⽀持多继承。
⼀个类⽆法继承多个抽象类。
抽象类包含属性和⽅法,这些属性和⽅法可以是public、private或protected。
接⼝只包含⽅法。
抽象类可提供部分⽅法的定义,但是接⼝不提供任何定义。
抽象类⽤于同⼀包中,⽽接⼝则可以在多个包中实现。
4.静态建模和动态建模之间的区别是什么静态建模表⽰软件系统的静态或结构成分,也称为结构建模;它包含类和对象关系图;它有助于描绘系统成分之间的关系和依赖性。
动态建模表⽰软件系统静态成分的⾏为,也成为⾏为建模;它包含交互、活动和状态关系图;它有助于表达系统在⼀段时间内的⾏为并对其建模。
5.UML的主要包括的3种构造成分UML主要包括三个基本构造块:事物(Things)、关系(Relationships)和图(Diagrams)。
事物是是实体抽象化的最终结果,是模型中的基本成员,UML中包含结构事物、⾏为事物、分组事物和注释事物。
关系是将事物联系在⼀起的⽅式,UML中定义了四种关系:依赖、关联、泛化、实现。
图是事物集合的分类,UML中包含多种图:类图、对象图、包图、组件图、部署图、⽤例图、顺序图、协作图、状态图、活动图。
类之间的⼏种关系类之间的关联关系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)是⼀种结构关系,说明⼀个事物的对象与另⼀个事物的对象相联系。
给定有关联的两个类,可以从⼀个类的对象得到另⼀个类的对象。
关联有两元关系和多元关系。
两元关系是指⼀种⼀对⼀的关系,多元关系是⼀对多或多对⼀的关系。
继承、实现、依赖、关联、聚合、组合的联系与区别分别介绍这几种关系:继承实现指的是一个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(Unified Modeling Language)是一种用于软件系统建模的标准语言。
在UML中,有四种基本关系,分别为依赖关系、关联关系、聚合关系和组合关系。
下面将对每种关系的含义和作用进行详细的解释。
1.依赖关系:依赖关系表示一个类的改变会引起另一个类的改变,但是两个类之间的关系不是强依赖的。
在依赖关系中,一个类需要另一个类的一些功能或资源才能完成自己的任务。
依赖关系通常体现在方法参数、方法返回值、方法中的局部变量或静态方法的调用等方面。
作用:-解耦:依赖关系可以降低类之间的依赖程度,提高系统的灵活性和可维护性。
-重用:通过依赖关系,一个类可以复用另一个类的功能,提高代码的重用性。
-扩展:通过依赖关系,一个类可以使用另一个类的功能,使得系统可以更方便地进行扩展和演化。
2.关联关系:关联关系表示类与类之间的连接,用于描述类之间的结构性的、静态的关系。
在关联关系中,一个类对象可以通过引用来使用另一个类对象的功能和资源。
关联关系一般是双向的,可以是单向的、双向的或自反的。
作用:-数据共享:通过关联关系,类可以共享另一个类的数据,实现数据的共享和交流。
-在系统的结构设计中起到桥梁作用:关联关系可以用于描述系统的结构,帮助开发人员对系统进行设计和实现。
3.聚合关系:聚合关系表示整体与部分之间的关系,它是一种弱的关联关系。
在聚合关系中,整体对象可以包含部分对象,但是部分对象的生命周期可以独立于整体对象而存在。
作用:-描述整体与部分之间的关系:聚合关系可以用于描述整体与部分之间的关系,帮助开发人员更好地理解系统的结构。
-组织和结构化数据:通过聚合关系,可以将对象进行组织和结构化,使得数据的管理更加便捷。
4.组合关系:组合关系也表示整体与部分之间的关系,但是它是一种强的关联关系。
在组合关系中,整体对象包含了部分对象,同时部分对象的生命周期与整体对象的生命周期相同。
四种依赖关系四种依赖关系在软件工程中,依赖关系是指一个类的实现需要另一个类的支持。
依赖关系是面向对象编程中非常重要的一种关系,它可以帮助我们更好地组织代码,提高代码的可读性和可维护性。
根据依赖关系的不同特点和表现形式,我们可以将其分为如下四种类型:一、使用关系使用关系是指一个类在其方法中使用了另一个类的对象作为参数或返回值。
这种关系比较简单,通常在代码中表现为方法签名中出现了其他类的名称。
例如:```javapublic void printInfo(Student student) {System.out.println("Name: " + student.getName() + ", Age: " + student.getAge());}```在这个例子中,printInfo方法使用了Student类的对象作为参数。
二、聚合关系聚合关系也称为“拥有”关系,它表示一个对象包含另一个对象。
与使用关系不同的是,在聚合关系中两个对象之间存在着“整体-部分”的层次结构。
例如:```javapublic class Department {private List<Employee> employees;//...}```在这个例子中,Department类包含了多个Employee对象,并且可以对其进行管理。
三、组合关系组合关系也称为“包含”关系,它表示一个对象由另一个对象组成。
与聚合关系不同的是,在组合关系中,两个对象之间不存在“整体-部分”的层次结构,它们是紧密耦合的。
例如:```javapublic class Car {private Engine engine;//...}```在这个例子中,Car类由Engine对象组成,并且Car类的实现依赖于Engine对象。
四、继承关系继承关系是面向对象编程中最基本的一种关系,它表示一个类从另一个类继承了其属性和方法。
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”关系,泛化关系用于描述父类与子类之间的关系,父类又称作基类或超类,子类又称作派生类。
对象间的4种关系对象间的4种关系:一、依赖关系依赖关系是指一个对象在完成某个操作时,需要借助另一个对象的帮助。
在依赖关系中,一个对象被另一个对象所依赖,被依赖的对象通常称为被依赖对象,而依赖的对象称为依赖对象。
以购物系统为例,购物车与商品之间存在着依赖关系。
购物车的功能是将用户选择的商品添加到购物车中,而购物车需要借助商品对象来实现这个操作。
购物车依赖于商品对象,只有在商品对象的存在和合法性确认之后,购物车才能将商品添加到购物车中。
二、关联关系关联关系是指两个对象之间存在着连接,一个对象知道另一个对象的存在。
关联关系是一种较强的关系,通常体现为一个对象是另一个对象的成员或属性。
以学校系统为例,学生与班级之间存在着关联关系。
一个班级可以包含多个学生,而一个学生只属于一个班级。
学生对象中会包含一个班级对象的引用,通过这个引用,学生对象可以知道自己所属的班级。
三、聚合关系聚合关系是指一个对象包含另一个对象,但又不是强依赖的关系。
聚合关系是一种拥有关系,其中整体对象拥有部分对象,但部分对象并不是整体对象的一部分。
以图书馆系统为例,图书馆与图书之间存在着聚合关系。
图书馆可以拥有多本图书,而图书作为图书馆的一部分,并不依赖于图书馆的存在。
当图书馆关闭时,图书对象仍然存在。
四、组合关系组合关系是指一个对象包含另一个对象,并且另一个对象是整体对象的一部分。
组合关系是一种强依赖关系,整体对象的生命周期与部分对象的生命周期紧密相关。
以汽车系统为例,汽车与发动机之间存在着组合关系。
发动机是汽车的一部分,没有发动机汽车就无法正常运行。
整个汽车对象的生命周期与发动机对象的生命周期是紧密相关的,当汽车被销毁时,发动机也会被销毁。
总结:依赖关系是一种较弱的关系,表示一个对象需要借助另一个对象来完成某个操作;关联关系是一种较强的关系,表示一个对象知道另一个对象的存在;聚合关系是一种拥有关系,表示一个对象包含另一个对象,但另一个对象并不是整体对象的一部分;组合关系是一种强依赖关系,表示一个对象包含另一个对象,并且另一个对象是整体对象的一部分。
简述类间的组合和聚合关系的区别与联系类间的组合和聚合关系是面向对象编程中常用的两种关系。
它们的区别和联系如下:
1. 区别:
组合关系是指两个类之间存在相互依赖的关系,其中一个类依赖于另一个类的属性或方法。
组合关系中的两个类是相互独立的,它们不能独立存在。
而聚合关系则是指两个类之间存在相互包含的关系,其中一个类包含另一个类的属性或对象,它们彼此之间是相互依赖的关系。
聚合关系中的两个类是相互依赖的,它们不能独立存在。
2. 联系:
组合和聚合关系之间存在一定的联系,组合可以看作是一种更紧密的聚合关系。
在组合关系中,两个类之间的依赖关系更加紧密,它们彼此之间相互依赖,互相提供支持。
而聚合关系则更加松散,两个类之间的依赖关系相对较弱,它们只是相互包含,并不提供支持。
3. 应用场景:
组合关系通常用于实现组件之间的交互和依赖关系,例如,在图形用户界面中,按钮可以作为一个组件与其他组件进行组合,以实现特定的功能。
而聚合关系则通常用于实现组件之间的相互依赖关系,例如,在文件系统中,文件夹可以包含文件,文件也可以包含文件夹,它们彼此之间相互依赖,以实现文件系统的正常运转。
4. 关系类型:
在面向对象编程中,通常有三种关系类型,分别是组合关系、聚合关系和关
联关系。
组合关系和聚合关系都是关系类型中比较典型的例子,它们区别在于它们之间的依赖关系更加紧密或松散。
而关联关系则是指两个类之间存在一对一的关系,例如,在人际关系中,一个人可以有一个父亲或一个母亲,但他们之间并不相互依赖,而是一种相互独立的关系。
UML关联和依赖区别UML中UML依赖和UML关联关系的异同1.关联:连接模型元素及链接实例,⽤⼀条实线来表⽰;2.依赖:表⽰⼀个元素以某种⽅式依赖于另⼀个元素,⽤⼀条虚线加箭头来表⽰;3.聚集:表⽰整体与部分的关系,⽤⼀条实线加空⼼菱形来表⽰;4.组成:表⽰整体与部分的有⼀关系,⽤⼀条实线加实⼼菱形来表⽰;(关联,依赖,聚集,组成的异同见后描述)5.泛化(继承):表⽰⼀般与特殊的关系,⽤⼀条实线加空⼼箭头来表⽰;6.实现:表⽰类与接⼝的关系,⽤⼀条虚线加空⼼箭头来表⽰;UML依赖和UML关联的异同:(《Java⾯向对象编程》⼀书,作者:孙卫琴来源:)在建⽴对象模型时,很容易把依赖、关联和聚集关系混淆。
当对象A和对象B之间存在依赖、关联或聚集关系时,对象A都有可能调⽤对象B的⽅法,这是三种关系之间的相同之处,除此之外,它们有着不同的特征。
1.UML依赖关系的特征对于两个相对独⽴的系统,当⼀个系统负责构造另⼀个系统的实例,或者依赖另⼀个系统的服务时,这两个系统之间主要体现为依赖关系,例如⽣产零件的机器和零件,机器负责构造零件对象。
再例如充电电池和充电器,充电电池通过充电器来充电。
再例如⾃⾏车Bicycle和打⽓筒Pump,⾃⾏车通过打⽓筒来充⽓。
图1-39为Bicycle类与Pump类的类框图。
图1-39Bicycle类与Pump类的依赖关系Bicycle类和Pump类之间是依赖关系,在Bicycle类中⽆需定义Pump类型的变量。
Bicycle类的定义如下:publicclassBicycle{/**给轮胎充⽓*/publicvoidexpand(Pumppump){pump.blow();}}在现时⽣活中,通常不会为某⼀辆⾃⾏车配备专门的打⽓筒,⽽是在需要充⽓的时候,从附近某个修车棚⾥借个打⽓筒打⽓。
在程序代码中,表现为Bicycle类的expand()⽅法有个Pump类型的参数。
以下程序代码表⽰某辆⾃⾏车先后到两个修车棚⾥充⽓:myBicycle.expand(pumpFromRepairShed1);//到第⼀个修车棚⾥充⽓myBicycle.expand(pumpFromRepairShed2);//若⼲天后,到第⼆个修车棚⾥充⽓。
类与类之间的六种关系在面向对象的编程中,类与类之间可以存在多种关系,这些关系表现出不同的结构和行为。
本文将介绍类与类之间的六种关系,并对其做简要说明。
1. 继承关系(Inheritance)继承是一种类与类之间最基本的关系之一。
通过继承,一个类可以继承另一个类的属性和方法,从而构建出一个新的类,新的类在功能方面可以包含父类的所有特性,也可以在此基础上增加自身的新特性。
2. 实现关系(Implementation)实现关系是一种类与接口(接口是一种规范,只包含方法定义)之间的关系。
一个类可以实现一个接口,从而获得该接口定义的所有方法,该类必须实现接口中所有的方法。
实现关系实现了接口与类的分离,提高了代码的灵活性和可重用性。
3. 聚合关系(Aggregation)聚合关系是一种“部分与整体”的关系,即一个类(整体)可以包含另一个类(部分)作为它的一个组成部分,与此同时,一个部分可以属于多个整体。
聚合关系常常用于构建复杂对象,可以形成一些常见的设计模式,如观察者模式、组合模式等。
4. 组合关系(Composition)组合关系也是一种“部分与整体”的关系,与聚合关系不同的是,组合关系强调整体与部分的生命周期一致,即一个整体被销毁时,它的所有部分也将被销毁。
组合关系常用于构建复杂的对象,例如 window 对象里面包含了多个控件。
5. 依赖关系(Dependency)依赖关系是一种“使用与被使用”的关系,即一个类使用了另一个类的服务,而这种使用关系通常是一种短暂的关系,只存在于方法调用的过程中。
依赖关系体现了类与类之间的耦合性,降低了代码的灵活性。
6. 关联关系(Association)关联关系是一种“拥有与被拥有”的关系,它比依赖关系更强,表现为一个类知道另一个类的存在,并且能够通过实例变量、静态变量等方式保存对另一个类的引用。
关联关系通常用于构建一些复杂的系统,比如 UML 中的类图,它们用集合来表示关联关系。
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:};class C10...{};组合(也有⼈称为包容):⼀般是实⼼菱形加实线箭头表⽰,如上图所⽰,表⽰的是C8被C7包容,⽽且C8不能离开C7⽽独⽴存在。
依赖关系、关联关系、聚合关系、组合关系、泛化关系和实现
关系
依赖关系:表示一个类的变化会影响另一个类,但两个类之间并不存在拥有和共享的关系。
类之间通过参数传递、方法调用等方式产生依赖关系。
关联关系:表示两个类之间的联系,强调的是它们之间的共享。
关联关系可以是单向的或双向的,可以是一对一的、一对多的或多对多的。
聚合关系:表示整体与部分之间的关系,整体对象拥有部分对象,但部分对象不是整体对象的一部分。
聚合关系是一种弱关联关系,两个对象的生命周期可以独立。
组合关系:也表示整体与部分之间的关系,但部分对象是整体对象的一部分,没有它们整体对象就无法存在。
组合关系是一种强关联关系,两个对象的生命周期是相互依赖的。
泛化关系:表示一个类是另一个类的特殊形式,继承关系的表示方式之一。
泛化关系体现了一种继承和特化的关系,子类继承了父类的属性和方法,并可以进行扩展和覆盖。
实现关系:表示一个类实现了一个接口,接口可以定义一组规范,类需要实现这些规范中定义的方法。
实现关系实现了一种接口或协议,在面向对象的编程中强调了一种规范和标准的约定。
你是我的玫瑰-类关系阐微世界是普遍联系的,因此程序世界中的类,也不可能是孤立的。
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可见依赖于与关联亦有动静之别,关联的类“静态”地引用了被关联类的实例变量,而依赖的偶然性也正说明了它的动态性。
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):关联关系的⼀种特例,表⽰部分和整体(整体 has a 部分)的关系。
uml中⽤带空⼼菱形头的实线表⽰Aggregation关系,菱形头指向整体。
组合(Composition):组合是聚合关系的变种,表⽰元素间更强的组合关系。
如果是组合关系,如果整体被破坏则个体⼀定会被破坏,⽽聚合的个体则可能是被多个整体所共享的,不⼀定会随着某个整体的破坏⽽被破坏。
uml中⽤带实⼼菱形头的实线表⽰Composition关系,菱形头指向整体。
1.1.1 依赖(Dependency):虚线箭头表⽰1、依赖关系也是类与类之间的联结2、依赖总是单向的。
依赖是比关联弱的关系,关联代表一种结构化的关系,体现在生成的代码中,以java为例:若类A单向关联指向类B,则在类A中存在一个属性B b。
若类A依赖类B,则不会有这个属性,类B的实例可能存在于某个方法调用的参数中,或某个方法的局部变量中。
例如代码:
依赖:----存在于某个方法调用的参数中,或某个方法的局部变量中。
Person类与Screwdriver类的依赖关系
[代码表现]
public class Person{
/** 拧螺丝 */
public void screw(Screwdriver screwdriver){
screwdriver.screw();
}
}
关联:---存在一个属性
公司(Company)和员工(Employee)的关联关系
[代码表现]
public class Company{
private Employee employee;
public Employee getEmployee(){
return employee;
}
public void setEmployee(Employee employee){
this.employee=employee;
}
//公司运作
public void run(){
employee.startWorking();
}
}
聚合:空心菱形加实线箭头表示
表示C9聚合C10,但是C10可以离开C9而独立存在(独立存在的意思是在某个应用的问题域中这个类的存在有意义。
这句话怎么解,请看下面组合里的解
释)。
同构性,主体和部分不具有生命期的一致性
课程组可由多个学生组成,课程组撤消了,学生还活得好好的,这是聚合。
组合(也有人称为包容):一般是实心菱形加实线箭头表示
异构性,部分和主体具有生命期上的一致性
表示的是C8被C7包容,而且C8不能离开C7而独立存在。
但这是视问题域而定的,例如在关心汽车的领域里,轮胎是一定要组合在汽车类中的,因为它离开了汽车就没有意义了。
但是在卖轮胎的店铺业务里,就算轮胎离开了汽车,它也是有意义的,这就可以用聚合了。
在《敏捷开发》中还说到,A组合B,则A需要知道B的生存周期,即可能A负责生成或者释放B,或者A通过某种途径知道B 的生成和释放。
组合的例子:你显示屏上的浏览器窗口,关闭浏览器,上面的按纽死掉不见了,这是组合(再打开一个浏览窗口,按纽已经不是原来的了)。
举例:
你和你的心脏之间是composition关系
你和你买的书之间是aggregation关系
你和你的朋友之间是association关系
关联和聚合的区别主要在语义上,关联的两个对象之间一般是平等的,例如你是我的朋友,聚合则一般不是平等的,例如一个公司包含了很多员工,其实现上是差不多的。
聚合和组合的区别则在语义和实现上都有差别,组合的两个对象之间其生命期有很大的关联,被组合的对象是在组合对象创建的同时或者创建之后创建,在组合对象销毁之前销毁。
一般来说被组合对象不能脱离组合对象独立存在,而且也只能属于一个组合对象,例如一个文档的版本,必须依赖于文档的存在,也只能属于一个文档。
聚合则不一样,被聚合的对象可以属于多个聚合对象,例如一个员工可能可以属于多个公司
看来大家对组合的理解没有意义,因为他们直接有共同的lifetime ,
甚至,被component的对象是否能够被其他类所见需要component 对象的同意。
association 代表引用服务,但不会永久保存引用的入口,比如,仅仅是参数引用,用完就丢弃,是最弱连接。
aggregation 聚合代表永久引用或强引用,也许对象生成的时候就获得了该引用。
虽然他们直接没有生命期的约束。
但是引用对象必须处理被引用对象义务消失的意外处理。
在讨论聚合,关联,组合区别,讨论那么多内部类干什么?
确实,他们的关系按强弱分有
关联<聚合<组合
我看大家主要分岐在聚合和组合上。
说白一点,聚合这种关系是被包含的对象的个数是 0..* 而组合是 1..*
聚合中的被包含对象可以没有。
而组合至少有一个。
聚合是一种拥有的关系,而组合是整体与部分的关系
举一个简单的例子:
一个图书馆可以有十万本书,也可以一本也没有。
但空的图书馆还是图书馆。
这是聚合
一个车(我们平常能看到的普通的交通工具车)有轮子,有的车是四轮子的,有的车是三轮的,自行车是二轮的,还有独轮车,但车至少要有一个轮子,不然就不是车。
这是组合关系。