类的UML表示方法

UML介绍

类图,是UML(统一建模语言)中用于描述"类"以及"类与类"之间的示意图。它形象的描述出了系统的结构,帮助人们理解系统。

类图是在"所有的UML图"中,实用频率非常之高;掌握它对于我们软件设计,以及交流都很有帮助。

对于类图而言,它的基本单位是类。类主要由三部分组成:类名、属性、操作(函数)。UML类的表示大致如下:

类名

类的名称

属性

UML类图中,属性的基本格式: 可见性 名称: 类型 [=缺省值]

  • 可见性 -- 表示该属性对于类外的元素而言是否可见。

    主要包括公有(public)、私有(private)、受保护(protected)以及包内可见(package private)四种,在类图中分别用符号+、-、#和~表示。

    UML中可见性和符号的对应关系如下所示:

可见性 符号
public +
package private
protected #
private -

在PlantUML中的表示形式如下图所示:

  • 名称 -- 表示属性名。
  • 类型 -- 表示属性的数据类型。可以是基本数据类型,也可以是用户自定义类型。
  • 缺省值 -- 属性的初始值。它是一个可选项。

操作

UML类图中,属性的基本格式: 可见性 名称(参数类表) [:返回类型]

  • 可见性 -- 表示该属性对于类外的元素而言是否可见。它的表示方法与"属性的可见性"相同。
  • 名称 -- 表示方法名。
  • 参数列表 -- 表示方法的参数。参数个数是任意的,多个参数之间用逗号","隔开。
  • 返回类型 -- 表示方法的返回值类型。它是一个可选项;可以是具体的返回类型,可以是void,也可以无返回类型(构造方法)。

"实体类", "抽象类", "接口"的UML表示和在PlantUML中的表示

  • 实体类的UML表示

    实体类在UML用类名表示。在PlantUML中实体类用 “带圆圈的C + 类名” 表示。

  • 抽象类的UML表示

    抽象类和实体类的UML表示法类似。区别是: "抽象类的类名是斜体",而"实体类的类名不是斜体";在PlantUML中用 “带圆圈的A + 斜体类名” 表示。

  • 接口的UML表示

    在UML中,通过在"类名"位置添加“interface” 关键字来表示接口。在PlantUML中用 “带圆圈的I + 斜体类名” 表示。

"实体类", "抽象类", "接口"在PlantUML中的表示如下图:

UML类图的几种关系

在UML类图中,关系可以分为4种: 泛化, 实现, 关联 和 依赖。

  1. 泛化 -- 表示"类与类之间的继承关系"。
  2. 实现 -- 表示"类与接口之间的实现"。
  3. 关联 -- 表示"类与类之间的拥有关系"。即,一个类是另一个类的成员。关联又包括:自关联, 单向关联, 双向关联, 多重性关联, 组合, 聚合。
  4. 依赖 -- 表示"类与类之间的使用关系"。即,一个类是另一类的局部变量, 形式参数, 或者调用了静态方法/成员等。

这几种关系表示的"类与类之间关系的强弱顺序"是:泛化 = 实现 > 关联 > 依赖

泛化(Generalization)

【关系说明】: 泛化是一种继承关系。它指定了子类如何特化父类的所有特征和行为。例如:老虎是动物的一种。

【代码说明】: 父类与子类。

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

【示例】: Fruit是"水果";Apple是"苹果",它继承了Fruit,是水果中的一种。

示例代码:

    public class Fruit {
protected int price;
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
} public class Apple extends Fruit {}

UML示例图:(以下所有的示例均是用PlantUML绘制而成,PlantUML使用手册可参看考:PlantUML参考指南

实现(Realization)

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

【代码说明】: 实现类与接口。

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

【示例】: Runnable接口表示"一个任务",TimeTask是"计时任务",它实现了Runnable接口。

示例代码:

    public interface Runnable {
abstract public void run();
}
public class TimeTask implements Runnable {
@Override
public void run() {
}
}

UML示例图:

关联(Association)

关联表示"类与类之间的拥有关系"。即,一个类是另一个类的成员。关联包括:自关联, 单向关联, 双向关联, 多重性关联, 聚合, 组合。

自关联

【关系说明】: 一个类包含自己。例如,单向链表中的节点,包含下一个节点的信息。

【代码说明】: 成员变量

【UML图形】: 带普通箭头的实心线,指向被自己。

【示例】: Node是单向链表中的节点,它包含下一个节点的指针。

示例代码:

    public class Node {
private Node node;
}

UML示例图:

单向关联

【关系说明】: "类A"中有"类B"成员变量,"类B"中没有"类A"成员变量。

【代码说明】: 成员变量

【UML图形】: 带普通单向箭头的实心线,指向被拥有者。

【示例】: Person表示"人",IdCard表示"身份证信息",身份证包括id和"身份证编号snum"。一个人拥有唯一的身份证信息。

示例代码:

    public class Person {
private IdCard idcard;
}
public class IdCard {
private int id;
private String snum;
}

UML示例图:

双向关联

【关系说明】: "类A"中有"类B"成员变量,"类B"也有"类A"成员变量。

【代码说明】: 成员变量

【UML图形】: 带普通双向箭头的实心线 或者 不带箭头的实心线。

【示例】: Cusomer表示"客户",Product表示"产品"。客户可以购买产品,产品也属于客户。

示例代码:

    public class Customer {
private Address address;
}
public class Address {
private Customer customer;
}

UML示例图:

聚合(Aggregation)

【关系说明]】: 聚合是整体与部分的关系。聚合关系是类与类之间关系比较密切的关联关系;要区分聚合和其它的关联关系,必须考察具体的逻辑关系。在聚合关系中,成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在。如车和轮胎是整体和部分的关系。

【代码说明】: 成员变量

【UML图形】: 带空心菱形的实心线,菱形指向整体

【示例】: Car表示"汽车",Tire表示"轮胎"。"轮胎"本身是个独立个体。

示例代码:

    public class Car {
private Tire tire;
} public class Tire {
private double radius;
private double perimeter;
}

UML示例图:

组合(Composition)

【关系说明】: 组合是整体与部分的关系。组合关系是比聚合关系还要强的关联关系。但是在组合关系中整体对象可以控制成员对象的生命周期,一旦整体对象不存在,成员对象也将不存在,成员对象与整体对象之间具有同生共死的关系。例如,身体和鼻子,身体包括鼻子,鼻子不能脱离身体而独立存在。

【代码说明】: 成员变量

【UML图形】: 带实心菱形的实线,菱形指向整体

【示例】: Body表示"身体",Nose表示"鼻子"。身体包含鼻子,鼻子离不开身体。

示例代码:

    public class Body {
private Nose nose; private class Nose {
}
}

UML示例图:

依赖(Dependency)

【关系说明】: 依赖是一种使用的关系。在需要表示一个事物使用另一个事物时使用依赖关系,尽量不使用双向的互相依赖。

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

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

【示例】: 人过河。人是"Person"类,它包括过河函数acrossRiver(),acrossRiver()的参数是过河工具,返回值是过河时间。此处的过河工具是船,船对应的类是Boat。

示例代码:

    public class Person {
public int acrossRiver(Boat boat);
}
public class Boat {
}

UML示例图:

参考资料

UML系列02之 UML类图(一)

UML系列03之 UML类图(二)

PlantUML参考指南

最新文章

  1. 内网渗透-代理(reGeorg)
  2. CozyRSS开发记录-中断
  3. (转) java定时器的几种用法
  4. 从下往上看--新皮层资料的读后感 第二部分:突触Synapses
  5. 第五章 征服数据库(Spring对DB的使用)——开发持久层
  6. css小知识点
  7. ServiceStack.OrmLite 笔记
  8. MySQL指定mysqld启动时所加载的配置文件
  9. C语言使用中的细节问题总结
  10. 百度地图BMap API实例
  11. JavaScript获取css 行间样式,内连样式和外链样式的方式
  12. Wiser的Junit测试用法
  13. QTCreator 更改代码高亮主题为 VS+VA助手 风格
  14. 类的父类object的一些属性、方法
  15. python selectsort
  16. 查看Android应用包名、Activity的几个方法
  17. python按引用赋值和深、浅拷贝
  18. c++局部变量在外可用的方法
  19. SqlHelper 1.0
  20. JavaScript进阶系列01,函数的声明,函数参数,函数闭包

热门文章

  1. beifencode
  2. Oracle案例06—— OGG-01098 Could not flush "./dirdat/e1000004383" (error 28, No space left on device)
  3. Python初学者第五天 列表及简单操作
  4. GCC the GNU
  5. 关于mysql启动问题---mysqld_safe mysqld from pid file * ended
  6. hashcode方法 简析
  7. Linux:配置HTTPS,获取ssl证书
  8. 如何理解 Learning to rank
  9. call/apply
  10. Redis客户端 Spring Data Redis(未完)