文档章节

UML类图关系图解

o
 osc_kt288isk
发布于 2018/07/23 22:33
字数 2095
阅读 19
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

一、类结构

在类的UML图中,使用长方形描述一个类的主要构成,长方形垂直地分为三层,以此放置类的名称、属性和方法。

其中,

  • 一般类的类名用正常字体粗体表示,如上图;抽象类名用斜体字粗体,如User;接口则需在上方加上<<interface>>
  • 属性和方法都需要标注可见性符号,+代表public#代表protected-代表private
  • 另外,还可以用冒号:表明属性的类型和方法的返回类型,如+$name:string+getName():string。当然,类型说明并非必须。

 

二、类关系

类与类之间的关系主要有六种:继承、实现、组合、聚合、关联和依赖,这六种关系的箭头表示如下

 

 

 

1、泛化(Generalization)

泛化是父类和子类之间的关系,子类继承父类的所有结构和行为。在子类中可以增加新的结构和行为,也可以覆写父类的行为。

一般用一个带空心箭头的实线表示泛化关系,UML图如下:

 

 

 

 

 

泛化对应Java中继承关系,即子类继承父类中出private修饰外的所有东西(变量、方法等)。示例代码:

public class Animal {

}

public class Tiger extends Animal {

}

 

Tiger继承Animal,因此Tiger与Animal之间是泛化(继承)关系。这个很好理解。

 

2、依赖(Dependency)

依赖关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的事物,反之不成立。在你想显示一个事物使用另一个事物时使用。

一般用一条指向被依赖事物的虚线表示,UML图如下:

 

 

 

 

 

通常情况下,依赖关系体现在某个类的方法使用另一个类作为参数。代码示例:

public class Screwdriver {    //螺丝刀,作为人类的工具,是用来被人类使用的

}

public class Person{

       public void screw(Screwdriver src){    //拧螺丝,需使用螺丝刀

        }
}    

 

Person类的screw()方法在使用时就得传入一个Screwdriver类型的参数,这样Screwdriver的改变就会影响到Person,因此Person与Screwdriver之间就是依赖关系(Person依赖于Screwdriver)。

 

3、关联(Association)

是一种结构关系,说明一个事物的对象与另一个事物的对象相联系。给定有关联的两个类,可以从一个类的对象得到另一个类的对象。关联有两元关系和多元关系。两元关系是指一种一对一的关系,多元关系是一对多或多对一的关系。两个类之间的简单关联表示了两个同等地位类之间的结构关系。当你想要表示结构化关系时使用关联。(可以想想Hibernate的关联关系)

一般用实线连接有关联的同一个类或不同的两个类。UML图如下:

 

 

 

 

 

通常情况下,关联关系是通过类的成员变量来实现的。代码示例:

public class Company {   //公司

private Employee emp ;  //一个公司雇员,公司与雇员之间就是一种关联关系。

}

public class Employee{

}

 

雇员作为公司的属性,不同于上面的依赖。依赖的话,雇员的改变会影响公司,显然不是。在这里雇员仅仅作为公司的一个属性而存在。因此Employee与Company之间是关联关系。关联关系还可以细分为聚合和组合两种。

3.1  聚合(Aggregation)

聚合是一种特殊的关联。它描述了“has-a”关系,表示整体对象拥有部分对象。

关联关系和聚合关系来语法上是没办法区分的,从语义 上才能更好的区分两者的区别。聚合是较强的关联关系,强调的是整体与部分 之间的关系。例如,学校和学生的关系。聚合的整体和部分之间在生命周期上没有什么必然的联系,部分对象可以在整体对象创建之前创建,也可以在整体对象销毁之后销毁。

一般用带一个空心菱形(整体的一端-学校)的实线表示。UML图如下:

 

 

 

 

与关联关系一样,聚合关系也是通过类的成员变量来实现的。示例代码:

public class Student{
}

public class School{  

       private List<Student> students ;  //学校与学生是聚合关系
}

 

学校是整体,而学生是部分。学校与学生都是可以独立存在的,之间没有什么必然的联系。因此学校与学生就是聚合关系。

3.2  组合(Composition)

组合是聚合的一种形式,它具有更强的拥有关系,强调整体与部分的生命周期是一致的,整体负责部分的生命周期的管理。生命周期一致指的是部分必须在组合创建的同时或者之后创建,在组合销毁之前或者同时销毁,部分的生命周期不会超出组合的生命周期。例如Windows的窗口和窗口上的菜单就是组合关系。如果整体被销毁,部分也必须跟着一起被销毁,如果所有者被复制,部分也必须一起被复制。

一般用带实心菱形(整体的一端)的实线来表示。UML图如下:

 

 

 

 

与关联关系一样,组合关系也是通过类的成员变量 来实现的。示例代码:

public class Menu{

}

public class Window{

       private List<Menu> menus ;

}

 

菜单的存在前提是窗口的存在,两者之间存在很强的拥有关系。且窗口对菜单的生命周期负责,只有在窗口创建之后,菜单才能够创建,菜单必须在窗口销毁之前销毁。因此Window与Menu之间是组合关系。

 

聚合和组合的区别在于:

  聚合关系是“has-a”关系,组合关系是“contains-a”关系;聚合关系表示整体与部分的关系比较弱,而组合比较强;聚合关系中代表部分事物的对象与代表聚合事物的对象的生存期无关,一旦删除了聚合对象不一定就删除了代表部分事物的对象。组合中一旦删除了组合对象,同时也就删除了代表部分事物的对象。

  另外有一个差别是组合中的一个对象在同一时刻只能属于一个组合对象,而聚合的一个部分对象可以被多个整体对象聚合,例如一个学生可以在多个学校就读,而一个菜单在同一时刻只能是某个窗口内的对象。

 

4、实现(Realization)

实现关系指定两个实体之间的一个合约。换言之,一个实体定义一个合约,而另一个实体保证履行该合约。对类来说,就是一个类实现了一个接口。

一般用一条指向接口的虚线表示,UML图如下:

 

 

 

实现对应Java中的实现接口(implements)。示例代码:

public interface Person{

}

public class Student implements Person{

}

 

这个和泛化一样很好理解。

 

三、总结

类间关系有很多种,在大的类别上可以分为两种:纵向关系、横向关系。纵向关系就是继承关系,它的概念非常明确,也成为OO的三个重要特征之一,这里不过多的讨论。

横向关系较为微妙,按照UML的建议大体上可以分为四种:

依赖    (Dependency)

关联    (Association)

聚合    (Aggregation)

组合    (Composition)

关于关联,聚合,组合在实现上并没有显著区别,相区别他们只有通过判断关系双方之间的实际关系,如关系强弱、创建与销毁之间有无必要关联等。

它们的强弱关系是没有异议的:依赖 < 关联 < 聚合 < 组合<泛化(继承)

实现方式区别:

(1)    依赖关系:关系对象出现在局部变量或者方法的参数里,或者关系类的静态方法被调用

(2)    关联关系:关系对象出现在实例变量中

(3)    聚合关系:关系对象出现在实例变量中

(4)    组合关系:关系对象出现在实例变量中

(5)    泛化: extends

(6)    实现: implements

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
浅入浅出Android(003):使用TextView类构造文本控件

基础: TextView是无法供编辑的。 当我们新建一个项目MyTextView时候,默认的布局(/res/layout/activity_main.xml)中已经有了一个TextView: <TextView 运行效果如下: 修改其文本内容...

樂天
2014/03/22
619
1
Nutch学习笔记4-Nutch 1.7 的 索引篇 ElasticSearch

上一篇讲解了爬取和分析的流程,很重要的收获就是: 解析过程中,会根据页面的ContentType获得一系列的注册解析器, 依次调用每个解析器,当其中一个解析成功后就返回,否则继续执行下一个解...

强子哥哥
2014/06/26
712
0
Javascript图元绘制库--ternlight

基于HTML CANVAS API的Javascript库,提供在HTML页面上绘制图元——如流程图的能力。 目前已支持简单的矩形图元和图元间的连线(直线、直角连线两种),拖拽图元等能力。 该javascript librar...

fancimage1
2013/02/07
6.2K
1
C++的JSON解析类--JSONVALUE

Jsonvalue 是 C++ 的 JSON 类,用来解析 JSON 到 C++ 对象,也可将对象转成 JSON 字符串。支持 ANSI 和 Unicode。特点: 严格和松散模式 不同数据类型 简单 API 仅依赖 STL 示例代码: JSON...

匿名
2013/03/10
2.9K
1
可视化的蛋白质配位图--VPLG

可视化的蛋白质配位图(VPLG)使用一个基于图的模型来描述蛋白质的结构,基于超级二级结构级别。一个蛋白质配位图是计算从原子坐标在PDB文件和二级结构作业的DSSP算法。在这个图,顶点代表二级结...

匿名
2012/10/28
2.2K
0

没有更多内容

加载失败,请刷新页面

加载更多

连续数据包采集:数据包——硬盘

nBox Recorder是一个网络流量磁盘记录器应用程序。使用nBox Recorder,您可以从实时网络接口以千兆位速率捕获全尺寸的网络数据包,并将其写入文件中。它的设计和开发主要是因为大多数网络安全...

osc_8ki1usvn
16分钟前
0
0
Docker中级篇|深入探究Docker

简介: 深入探究Docker Docker镜像理解 Docker镜像是什么 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代...

阿里云技术博客
17分钟前
0
0
一口气说出 9种 分布式ID生成方式,面试官有点懵了

一、为什么要用分布式ID? 在说分布式ID的具体实现之前,我们来简单分析一下为什么用分布式ID?分布式ID应该满足哪些特征? 1、什么是分布式ID? 拿MySQL数据库举个栗子: 在我们业务数据量不...

漫话编程
今天
0
0
tiktok如何运营

TK的模式 TK 是字节跳动(Byte Dance)公司原创的短视频社交 App,一家成立 8 年、以数据驱动的技术公司。 我们平时用的今日头条、西瓜视频、悟空问答、抖音等等都是字节跳动的产品。 字节跳...

osc_xs2d5ls9
17分钟前
16
0
《OpenCv视觉之眼》Python图像处理三 :Opencv图像属性、ROI区域获取及通道处理

本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的、不同方法的处理,以达到对图像进行去噪、锐化等...

osc_tjhvpz8x
19分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部