2.2.2 类图

2.2.2 类图

类图是最古老、功能最丰富、使用最广泛的UML图。类图表示系统中应该包含哪些实体,各实体之间如何关联;换句话说,类图显示了系统的静态结构,类图可用于表示逻辑类,逻辑类通常就是业务人员所谈及的事物种类。

类图的图形表示

类在类图上使用包含三个部分的矩形来描述:

  • 最上面的部分显示类的名称,
  • 中间部分包含类的属性,
  • 最下面的部分包含类的方法。

图2.11显示了类图中类的表示方法。
这里有一张图片
类图除可以表示实体的静态内部结构之外,还可以表示实体之间的相互关系

类之间的三种基本关系

类之间有三种基本关系:

  • 关联(包括聚合、组合)
  • 泛化(与继承同一个概念)
  • 依赖

1. 关联

客观世界中的两个实体之间总是存在千丝万缕的关系,当把这两个实体抽象到软件系统中时,两个类之间必然存在关联关系。

单向关联

关联具有一定的方向性:如果仅能从一个类单方向地访问另一个类,则被称为单向关联;

双向关联

如果两个类可以互相访问对象,则被称为双向关联

多重性

一个对象能访问关联对象的数目被称为多重性,例如,建立学生和老师之间的单向关联,则可以从学生访问老师,但从老师不能访问学生。

关联图形表示

关联使用一条实线来表示,带箭头的实线表示单向关联

关联和属性的区别

在很多时候,关联和属性很像,关联和属性的关键区别在于:类里的某个属性引用到另外一个实体时,则变成了关联

聚合 组合

关联关系包括两种特例:聚合和组合,它们都有部分和整体的关系,组合比聚合更加严格
当某个实体聚合成另一个实体时,该实体还可以同时是另一个实体的部分。
例如,学生既可以是篮球俱乐部的成员,也可以是书法俱乐部的成员;
当某个实体组合成另一个实体时,该实体则不能同时是个实体的部分。

  • 聚合使用带空心菱形框的实线表示,
  • 组合则使用带实心菱形框的实线表示。

实例

图2.12显示了几个类之间的关联关系。
这里有一张图片
图2.12中描述TeacherStudent之间的关联关系:它们是双向关联关系,而且使用了多重性来表示TeacherStudent之间存在1:N的关联关系(1..*表示可以是一个到多个),即一个Teacher实体可以有1个或多个关联的Student实体;

StudentBasketBallClub存在聚合关系,即1个或多个Student实体可以聚合成一个BasketBallClub实体;
Arm(手臂)和Student之间存在组合关系,2个Arm实体组合成一个Student实体。

2. 泛化

泛化与继承是同一个概念,都是指子类是一种特殊的父类,类与类之间的继承关系是非常普遍的。

继承关系

继承关系使用**带空心三角形的实线**表示。图2.13显示了StudentPerson类之间的继承关系
这里有一张图片
从图2.13可以看出,StudentPerson的子类,即Student类是种特殊的Person类。

实现关系

还有一种与继承类似的关系,类实现接口可视为一种特殊的继承,这种实现用**带空心三角形的虚线**表示

3. 依赖

如果一个类的改动会导致另一个类的改动,则称两个类之间存在依赖。依赖关系使用带箭头的虚线表示,其中箭头指向被依赖的实体。依赖的常见可能原因如下:

  • 改动的类将消息发给另一个类。
  • 改动的类以另一个类作为数据部分。
  • 改动的类以另一个类作为操作参数。

通常而言,依赖是单向的,尤其是当数据表现和数据模型分开设计时,数据表现依赖于数据模型。例如,JDK基础类库中的JTableDefaultAbleModel,关于这两个类的介绍请参考本书12.11节的介绍。图2.14显示了它们之间的依赖关系
这里有一张图片
对于图2.14中表述的JTableDefaultTableModel两个类,其中DefaultTableModelJTable的数据模型,DefaultTableModel发生改变时,JTable将相应地发生改变
CrazyJavaHandout4/Chapter2/2.2.1/