知识点

相关文章

更多

最近更新

更多

UML 继承、实现、依赖、关联、聚合、组合的联系与区别

2019-03-28 21:50|来源: 网络

这是一堂关于UML基础知识的补习课;现在我们做项目时间都太紧了,基本上都没有做过真正的class级别的详细设计,更别提使用UML来实现规范建模了;本篇主要就以前自己一直感觉很迷糊的几种class之间的关系进行整理,让我们在真正用UML进行比如类图设计时能够更加清晰明了;以下就分别介绍这几种关系:

继承

指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系;在Java中此类关系通过关键字extends明确标识,在设计时一般没有争议性;

UML 继承、实现、依赖、关联、聚合、组合的联系与区别 - xiaotot - 享受编码

实现

指的是一个class类实现interface接口(可以是多个)的功能;实现是类与接口之间最常见的关系;在Java中此类关系通过关键字implements明确标识,在设计时一般没有争议性;

UML 继承、实现、依赖、关联、聚合、组合的联系与区别 - xiaotot - 享受编码

依赖

可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、、临时性的、非常弱的,但是B类的变化会影响到A;比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖;表现在代码层面,为类B作为参数被类A在某个method方法中使用;

UML 继承、实现、依赖、关联、聚合、组合的联系与区别 - xiaotot - 享受编码

关联

他体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的、关联可以是单向、双向的;表现在代码层面,为被关联类B以类属性的形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量;

UML 继承、实现、依赖、关联、聚合、组合的联系与区别 - xiaotot - 享受编码

聚合

聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;比如计算机与CPU、公司与员工的关系等;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;

UML 继承、实现、依赖、关联、聚合、组合的联系与区别 - xiaotot - 享受编码

组合

组合也是关联关系的一种特例,他体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合;他同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束;比如你和你的大脑;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;

UML 继承、实现、依赖、关联、聚合、组合的联系与区别 - xiaotot - 享受编码

对于继承、实现这两种关系没多少疑问,他们体现的是一种类与类、或者类与接口间的纵向关系;其他的四者关系则体现的是类与类、或者类与接口间的引用、横向关系,是比较难区分的,有很多事物间的关系要想准备定位是很难的,前面也提到,这几种关系都是语义级别的,所以从代码层面并不能完全区分各种关系;但总的来说,后几种关系所表现的强弱程度依次为:组合>聚合>关联>依赖

   

   From:http://www.blogjava.net/luluyanglu/archive/2011/10/06/360086.html            
 

相关问答

更多
  • 你必须以相反的方式阅读它。 如果您在Class末端有1..* ,则表示Student至少有1个和可能更多的Classes 。 Class 0..*表示学生也可以没有Classes 。 You have to read it the other way around. If you have 1..* on the Class end that means that a Student has at least 1 and possible more Classes. 0..* on the Class en ...
  • 这是允许的。 您可以在子类之间建立关联,甚至可以在子类和基类之间建立关联。 It is allowed. You can have association between subclasses or even between subclasses and the base class.
  • Rumbaugh的声明是最有说服力的,Bob叔叔的好建议。 正如我在其他地方所说,聚合在语义上很弱,没有提供任何实际的益处。 它只有一个有效的角色(递归关系的非循环),但是很少有人知道和理解。 所以你最终不得不在评论中指出。 我只是不使用它。 并没有感到任何损失。 坚持简单的二元关联,并专注于真正重要的事情 - 获得基数和命名权。 你会得到更多的,比尝试决定不可判定的关联与聚合。 心连心。 Rumbaugh's statement is the most telling and Uncle Bob's go ...
  • 您可以在两个类之间建立许多关联,以及许多依赖关系。 您应该刻画这些依赖关系以区分它们。 You can have many associations between two classes, as well as many dependencies. You should stereotype those dependencies to differentiate them.
  • 我不认为2.2中的变化有明确的概述。 有一个带有更改栏的UML 2.2规范文档:它标记了更改的部分,而不是版本2.1.2。 这真的是查看这些变化的最佳方式 - 再次,没有真正的概述,至少没有我能找到的。 您可以在此处查看文档(PDF)。 我略微浏览了一下文档。 他们大多是微小的变化。 我遇到的一些变化可以很快找到: 8.3(类别描述) 8.3.2(ComponentRealization) 10.2(部署 - 抽象语法) 11.2(抽象语法) 11.3.12(ClearStructuralFeatureAc ...
  • 是的,UML允许从类到自身的关联。 同样地,允许聚合甚至组合。 您发布的图像显示聚合,而根据您的描述,我会选择一个合成(填充的钻石):一个类别有一个或没有父级; 一个类别在某种程度上由其子女定义; 如果某个类别被删除,则所有子项也将被删除。 可以在此处找到聚合和组合之间的较长比较。 Yes, UML allows associations from a class to itself. Likewise aggregations and even compositions are allowed this ...
  • 你的问题很模糊,但让我们从IBM的描述开始: http://www.ibm.com/developerworks/rational/library/content/RationalEdge/sep04/bell 搜索聚合和组合。 基本上,聚合用于具有多个相关组件的类,例如汽车及其零件。 当汽车总计时,车轮可以被拆除。 轮子可能有其他用途(库存,修理,回收等)。 当组件的生命周期依赖于父类生命周期时,就存在组合。 组合的一个例子是企业及其运营(如装货码头)。 当业务关闭时,不再需要装载台,因此两个实例都将被删 ...
  • 你不是在问一个UML问题,而是问一个更普遍的问题。 继承是什么意思? ClassC是ClassA的子类。 在每种实现继承的编程语言中,ClassC都具有ClassA的所有功能。 在不支持继承的语言中,您必须通过确保ClassA的所有功能也是ClassC的一部分来创建正确继承的错觉。 这是继承的定义。 永远和永远。 即使在UML图中。 You're not asking a UML question, you're asking a more general question. What does inher ...
  • 我将按原样阅读您的图表,即 - 我会解释它。 如果我的解释是正确的,那么你的模型可能是正确的。 这就是UML的全部意义 - 在建模下明确地传输信息。 所以... 阅读图表:报纸上有文章,包括GoodArticles和BadArticles。 文章独立存在于报纸上,如果您删除报纸实例,其文章将保持“浮动”状态。 你说: 我实际上使用GoodArticle与报纸进行通信而不是实际编码中的父类文章。 但是在表示UML方面,我仍然应该将父类(Article)连接到报纸,即使它实际上是GoodArticle? 不。如 ...
  • 我认为这不是该词的强烈“UML意义”的构成。 来自维基百科 : 复合对象与组件之间的关系是强有力的“有”关系,因为复合对象取得组件的所有权。 这意味着复合材料负责组件的创建和销毁。 机场不会创建国家(在IT意义上,“国家”对象也不负责提供/创建“机场”对象)。 从这个意义上说,你正在寻找一个协会; 我认为第一个更合适(在“一般”中说话)。 但核心方面是: 您的模型必须表达 您域的特定要求。 换句话说:两种解决方案都是有效的; 它在很大程度上取决于选择的背景。 换句话说:你选择一个可以帮助你解决问题的方法! ...