类图的目的
- 显示系统中分类器的静态结构
- 该图提供了UML规定的其他结构图的基本表示法
- 对开发人员和其他团队成员也很有帮助
- 业务分析师可以使用类图来从业务角度对系统进行建模
UML类图由以下部分组成:
- 一组课程和
- 类之间的一组关系
什么是班级
系统中具有相似角色的一组对象的描述,包括:
- 结构特征(属性)定义类的哪些对象“知道”
- 表示类的对象的状态
- 是对类的结构或静态特征的描述
- 行为特征(操作)定义了类“可以做什么”的对象
- 定义对象可以交互的方式
- 操作是对类的行为或动态特征的描述
类符号
附加符号由三部分组成:
- 班级名称
- 类的名称出现在第一个分区中。
- 类属性
- 属性显示在第二个分区中。
- 冒号后显示属性类型。
- 属性映射到代码中的成员变量(数据成员)。
- 班级操作(方法)
- 操作显示在第三个分区中。它们是班级提供的服务。
- 方法的返回类型显示在方法签名末尾的冒号之后。
- 方法参数的返回类型显示在参数名称后面的冒号之后。
- 操作映射到代码中的类方法
类的图形表示 – MyClass如上所示:
- MyClass有3个属性和3个操作
- op2的参数p3的类型为int
- op2返回一个浮点数
- op3将一个指针(用*表示)返回给Class6
阶级关系
一个类可能涉及与其他类的一个或多个关系。关系可以是以下类型之一:(请参阅右侧的图以了解关系的图形表示)。
关系类型 | 图示 |
---|---|
继承(或泛化):
|
|
简单的协会:
|
|
聚合:
一种特殊类型的关联。它代表了“一部分”关系。
|
|
组成:
一种特殊类型的聚合,其中部件在整个销毁时被销毁。
|
|
依赖性:
|
关系名称
- 关系名称写在关联线的中间。
- 当你大声读出它们时,良好的关系名称是有意义的:
- “每个电子表格都包含一些单元格”,
- “表达式求值为”
- 它们通常有一个小箭头来显示读取关系的方向,例如,表达式评估为值,但值不会评估为表达式。
关系 – 角色
- 角色是关联的方向目的。
- 角色写在关联线的末尾,并描述该关系中该类所起的作用。
- 例如,单元格与表达式相关。关系的本质是表达式是细胞的公式。
类属性和操作的可见性
在面向对象的设计中,存在对属性和操作的可见性的表示。UML标识了四种类型的可见性:public,protected,private和package。
类中的属性和操作名称之前的+, – ,#和〜符号表示属性和操作的可见性。
- +表示公共属性或操作
- – 表示私有属性或操作
- #表示受保护的属性或操作
- 〜表示包属性或操作
类可见性示例
在上面的例子中:
- MyClassName的attribute1和op1是公共的
- attribute3和op3受到保护。
- attribute2和op2是私有的。
对于不同类的成员,下面显示了对这些可见性类型的访问权限。
访问权 | 公众(+) | 私人的 (-) | 受保护的(#) | 套餐(〜) |
---|---|---|---|---|
同一班的成员 | 是 | 是 | 是 | 是 |
派生类的成员 | 是 | 没有 | 是 | 是 |
任何其他类的成员 | 是 | 没有 | 没有 | 在同一个包中 |
多重
每个班级有多少个对象参与关系,多重性可以表示为:
- 完全是1 – 1
- 零或一 – 0..1
- 很多 – 0 .. *或*
- 一个或多个 – 1 .. *
- 确切数字 – 例如3..4或6
- 或者复杂的关系 – 例如0..1,3..4,6 * *表示除2或5之外的任何数量的对象
多重性示例
- 要求:学生可以参加许多课程,许多学生可以参加一门课程。
- 在下面的示例中,类图(左侧)描述了静态模型的上述要求声明,而对象图(右侧)显示了课程注册的快照(类图的实例)分别是软件工程和数据库管理课程)
聚合示例 – 计算机和部件
- 聚合是表示“包含”层次结构的关联的特殊情况
- 聚合是父类,组件是子类
继承示例 – 单元分类
- 继承是表示“种类”层次结构的关联的另一种特殊情况
- 继承通过引入分类法简化了分析模型
- 子类继承父类的属性和操作。
类图 – 图工具示例
类图还可以附加到类或关系的注释。注释以灰色显示。
在上面的例子中:
我们可以通过阅读以下几点来解释上述类图的含义。
- Shape是一个抽象类。它以斜体显示。
- Shape是一个超类。圆形,矩形和多边形源自Shape。换句话说,圆是一个形状。这是一种泛化/继承关系。
- DialogBox和DataController之间存在关联。
- 形状是Window的一部分。这是一种聚合关系。没有Window就可以存在形状。
- Point是Circle的一部分。这是一种构图关系。没有圆就不能存在点。
- 窗口取决于事件。但是,Event不依赖于Window。
- Circle的属性是半径和中心。这是一个实体类。
- Circle的方法名称是area(),circum(),setCenter()和setRadius()。
- Circle中的参数radius是float类型的参数。
- 类Circle的方法area()返回double类型的值。
- 隐藏Rectangle的属性和方法名称。图中的其他一些类也隐藏了它们的属性和方法名称。
处理复杂系统 – 多个或单个类图?
不可避免的是,如果您要对大型系统或大型业务区域进行建模,则必须考虑许多实体。我们应该使用多个或单个类图来建模问题吗?答案是:
- 不是在单个类图上对每个实体及其关系进行建模,而是使用多个类图更好。
- 将系统划分为多个类图使系统更易于理解,特别是如果每个图是系统特定部分的图形表示。
软件开发生命周期中类图的透视
我们可以在软件开发生命周期的不同开发阶段使用类图,并且通常在我们前进的过程中逐步建模三个不同视角(细节层次)的类图:
概念视角:图表被解释为描述现实世界中的事物。因此,如果您从概念角度出发,则绘制一个代表所研究领域中的概念的图表。这些概念自然会与实现它们的类相关。概念视角被认为与语言无关。
规范透视图:图表被解释为描述具有规范和接口的软件抽象或组件,但不承诺特定实现。因此,如果您从规范角度来看,我们正在研究软件的接口而不是实现。
实现视角:图表被解释为描述特定技术和语言的软件实现。因此,如果您从实现的角度来看,我们正在研究软件实现。
尝试现在绘制UML类图
您已经了解了类图是什么以及如何绘制类图。是时候绘制一个自己的类图。获取Visual Paradigm Community Edition,一个免费的UML软件,并使用免费的Class Diagram工具创建自己的类图。它易于使用且直观。