类图

基本概念:
类图(Class Diagram):
类图是面向对象系统建模中最常用和最重要的图,是定义其它图的基础。类图主要是用来显示系统中的类、接口以及它们之间的静态结构和关系的一种静态模型。

类图的3个基本组件:

类名、属性、方法。

在UML类图中,常见的有以下几种关系:

泛化(Generalization)
实现(Realization)
关联(Association)
依赖(Dependency)
聚合(Aggregation)
组合(Composition)

1. 泛化(Generalization)

【泛化关系】:
是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。
例如:老虎是动物的一种,即有老虎的特性也有动物的共性。

【箭头指向】:
带三角箭头的实线,箭头指向父类

2. 实现(Realization)

【实现关系】:
是一种类与接口的关系,表示类是接口所有特征和行为的实现.

【箭头指向】:
带三角箭头的虚线,箭头指向接口

3. 关联(Association)

【关联关系】:
是一种拥有的关系,它使一个类知道另一个类的属性和方法;
如:老师与学生,丈夫与妻子关联可以是双向的,也可以是单向的。
双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。

【代码体现】:
成员变量

【箭头及指向】:
带普通箭头的实心线,指向被拥有者


上图中,老师与学生是双向关联,老师有多名学生,学生也可能有多名老师。
但学生与某课程间的关系为单向关联,一名学生可能要上多门课程,课程是个抽象的东西他不拥有学生。

下图为自身关联:

4. 依赖(Dependency)

【依赖关系】:
是一种使用的关系,即一个类的实现需要另一个类的协助,所以要尽量不使用双向的互相依赖.

【代码表现】:
局部变量、方法的参数或者对静态方法的调用

【箭头及指向】:
带箭头的虚线,指向被使用者

5. 聚合(Aggregation)

【聚合关系】:
是整体与部分的关系,且部分可以离开整体而单独存在。
如车和轮胎是整体和部分的关系,轮胎离开车仍然可以存在。

聚合关系是关联关系的一种,是强的关联关系;
关联和聚合在语法上无法区分,必须考察具体的逻辑关系。

【代码体现】:
成员变量

【箭头及指向】:
带空心菱形的实心线,菱形指向整体

6. 组合(Composition)

【组合关系】:
是整体与部分的关系,但部分不能离开整体而单独存在。
如公司和部门是整体和部分的关系,没有公司就不存在部门。

组合关系是关联关系的一种,是比聚合关系还要强的关系,它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。

【代码体现】:
成员变量

【箭头及指向】:
带实心菱形的实线,菱形指向整体

各种关系的强弱顺序:
泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖

下面这张UML图,比较形象地展示了各种类图关系:

多重性(Multiplicity) :
通常在关联、聚合、组合中使用。就是代表有多少个关联对象存在。使用数字…星号(数字)表示。如下图,一个割接通知可以关联0个到N个故障单。

UML实例分析

联通客户响应OSS。系统有故障单、业务开通、资源核查、割接、业务重保、网络品质性能等功能模块。现在我们抽出部分需求做为例子讲解。

大家可以参照着类图,好好理解。

  1. 通知分为一般通知、割接通知、重保通知。这个是继承关系。
  2. NoticeService和实现类NoticeServiceImpl是实现关系。
  3. NoticeServiceImpl通过save方法的参数引用Notice,是依赖关系。同时调用了BaseDao完成功能,也是依赖关系。
  4. 割接通知和故障单之间通过中间类(通知电路)关联,是一般关联。
  5. 重保通知和预案库间是聚合关系。因为预案库可以事先录入,和重保通知没有必然联系,可以独立存在。在系统中是手工从列表中选择。删除重保通知,不影响预案。
  6. 割接通知和需求单之间是聚合关系。同理,需求单可以独立于割接通知存在。也就是说删除割接通知,不影响需求单。
  7. 通知和回复是组合关系。因为回复不能独立于通知存在。也就是说删除通知,该条通知对应的回复也要级联删除。经过以上的分析,相信大家对类的关系已经有比较好的理解了。大家有什么其它想法或好的见解,欢迎拍砖。

重点讲一下聚合和组合的关系:
聚合关系图:

组合关系图:

从代码上看这两种关系的区别在于:
构造函数不同,重点在于整体是否控制被关联的对象的什么周期。

可以参考下面的函数理解。

/* 雁群类: */public  class GooseGroup  {  public Goose goose;  public GooseGroup(Goose goose)  {  this.goose = goose;  }}/* 大雁类:*/
public class Goose
{  public Wings wings;  public Goose()  {  wings = new Wings();  }
}

聚合关系的类里含有另一个类作为参数:

雁群类(GooseGroup)的构造函数中要用到大雁(Goose)作为参数把值传进来。
大雁类(Goose)可以脱离雁群类而独立存在,即大雁类的生命周期,不受雁群类控制。

组合关系的类里含有另一个类的实例化:

大雁类(Goose)在实例化之前,一定要先实例化翅膀类(Wings) ,两个类紧密耦合在一起,它们有相同的生命周期
翅膀类(Wings)不可以脱离大雁类(Goose)而独立存在。

信息的封装性不同
在聚合关系中,客户端可以同时了解雁群类和大雁类,因为他们都是独立的
而在组合关系中,客户端只认识大雁类,根本就不知道翅膀类的存在,因为翅膀类被严密的封装在大雁类中。

另外,还有一种关系Nest嵌套内部类

嵌套(Nest)

【组合关系】:
将一个类的定义放到另一个类中,这个类就叫嵌套类。

【箭头及指向】:
带内部有十字线的圆的实线,内部有十字线的圆指向被嵌套的类。

如下图,Class2、Class3是嵌套类,在Class1的内部。

Astah 画C++类图


内部类UML 类图画法:

所用工具:

名称Nest,使用时先点击外部类,再点击内部类

Structure:

第2种方法:
在Structure界面直接在ClassA上右键,选择Create Model -> Nested Class,然后命名好类名之后,把内部类拖到画图界面即可

更多Astah画类图的方法请参考:
https://astah.net/support/astah-pro/user-guide/class-diagrams/
或者
Astah Reference Manual(PDF手册)

感谢

C++ UML类图详解
C++(21)–Astah uml 画C++类图
用Astah画UML表示内部类的画法

C++ 类图 Astah画类图相关推荐

  1. php类图怎么画,类图怎么画?

    类图怎么画? 步骤: 1.打开visio画图软件,在左边的导航中选择"软件"选项,在右边会有很多图,我们会看到UML图,点击选择进入. 2.我们会进入画图的界面,在上面导航区有个百 ...

  2. java 折线动图_Java画折线图

    JFreeChart 是开放源代码站点SourceForge.net 上的一个 JAVA 项目,它主要用来各种各样的图表,这些图表包括:饼图.柱状图 ( 普通柱状图以及堆栈柱状图 ).线图.区域图.分 ...

  3. python画动态图-python画动态图

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 而漂漂亮亮的可视化是完成这一任务的绝佳工具. 本文将介绍 5 种非传统的 ...

  4. python 画三维函数图-Python画三维图-----插值平滑数据

    一.二维的插值方法: 原始数据(x,y) 先对横坐标x进行扩充数据量,采用linspace.[如下面例子,由7个值扩充到300个] 采用scipy.interpolate中的spline来对纵坐标数据 ...

  5. matlab泰勒图,matlab画泰勒图

    急 在matlab中写个用泰勒级数计算arctan(x)的方程 clear;clc;x=1;s=0;y=atan(x);fori=1:1e6n=2*i-1;s=s+(-(-1)^i)*(x^n)/n; ...

  6. python画超长图-python 画长图

    广告关闭 腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元! 最近遇到个任务需要画一些坐标图,我就在想,用了这么长时间的 python 了,能不 ...

  7. python绘制小提琴图_seaborn画小提琴图(violin plot)

    简介 小提琴图是用来展示多组数据的分布状态以及概率密度.跟箱线图类似,但是可以密度层面展示更好.在数据量非常大不方便一个一个展示的时候小提琴图特别适用.而python里面的seaborn包可以很方便的 ...

  8. matlab如何画波特图,matlab画波特图

    Matlab 中 Bode 图的绘制技巧 学术收藏 2010-06-04 21:21:48 阅读 54 评论 0 字号:大中小 订阅 我们经常会遇到使用 Matlab 画伯德图的情况,可能我们我们都. ...

  9. python画离散图_python画离散图

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 不过,恋习python突然想到,可以通过python将故宫的建筑物图片,转化为手 ...

  10. matplotlib在一张图同时画折线图和柱状图

    实现了在一张图片里用matplotlib的pyplot同时绘制折线图和柱状图. # -*- coding:utf-8 -*- import matplotlib import matplotlib.p ...

最新文章

  1. 微服务架构的基础框架选择:Spring Cloud还是Dubbo?
  2. 【Ubuntu-Docker】ubuntu16.04(18.04)Docker安装配置与卸载
  3. 将m文件通过matlab 的编译器转换为可执行文件,【转】 Matlab中提高m文件执行效率的小技巧...
  4. Struts项目中前端页面向后台页面传参中文出现乱码(Get请求)
  5. 项目国际化时,简体中文转繁体的自己主动化方案
  6. 树莓派安装qq linux,在(Raspberry Pi)树莓派上安装NodeJS
  7. java8实战:使用流收集数据之toList、joining、groupBy(多字段分组)
  8. 科睿唯安官网更新SCI期刊列表,慎投2月已被剔除期刊
  9. 怎样做小游戏挖金子(VC,源码5)
  10. 苹果手机如何查看html代码,苹果手机怎么利用代号查看硬件信息
  11. 汉字显示原理 GB2312 编码
  12. 计算机或信息化的专业职称,信息系统项目管理师是高级职称吗?
  13. 【矩阵论】线性空间与线性变换(5)
  14. FPGA分频电路实现(奇数,偶数,小数半分频,任意分频)
  15. 极光会客厅:大型H5游戏如何登陆微信小游戏及游戏性能优化分享
  16. LoadRunner 11安装和使用
  17. 软件测试 三角形问题
  18. 系统的零点、极点物理含义
  19. jacob操作word和excel
  20. C语言代码中的空白符

热门文章

  1. 计算机无法安装新字体,在计算机上安装新字体
  2. HBuilder常用的快捷操作
  3. robotium android,android自动化测试框架robotium配置和使用
  4. Qt IFW 实现自动升级
  5. Symbian S60第三版软件精选介绍
  6. 计算机课堂有趣的游戏,有趣的课堂游戏作文范文5篇
  7. mysql怎么没有中文手册_mysql 中文手册
  8. 电脑蓝牙连接android程序,win7系统下电脑与Android手机蓝牙连接方法
  9. python强制关闭文件_正在强制删除文件。Python,Windows
  10. 紫光输入法linux,紫光拼音输入法下载_紫光拼音输入法最新版下载-太平洋下载中心...