面向对象设计-UML类图

UML-类图简介

1. 应用场景和简介

UML(Unified Modeling Language)是在软件工程领域广泛使用的一种建模语言,主要目的是以一种可视化的方式来展示软件系统的设计,而类图是UML中的一种,对面向对象系统设计来说,类图可以方便的展示面向对象系统中对象的属性、方法,以及对象之间的静态关系,并且可以很方便的转化为实际代码。类图可以用一种形象直观的方式,描述面向对象系统的设计思路。

因此类图应该是每一个面向对象语言的开发者应该了解的,本篇博客基于网络上的相关资源,对类图中的基本元素做一个简单介绍,并在文章最后给出一个类图的示例,如果想要深入学习类图或者UML的同学可以参考最后给出的参考链接。

2. 基本元素介绍

2.1 Class - 类

类作为面向对象中创建对象的模版,是构成类图的最基本元素。

Class

如上图所示,类图中描述类的基本结构有三部分:

  • 类名:最上面的部分,首字母大写,表示类的名称
  • 属性:中间部分,首字母小写,代表类的属性(即instance field)
  • 方法:最下面部分,首字母小写,表示类的方法(能够对该类型对象所执行的操作)

这里需要强调一点,描述类的时候,如果类图的目的是要表达类之间的关系,则可以忽略属性和方法部分,仅仅保留类名,这里可以根据设计的抽象程度和主要关注点对类元素对展示内容做取舍。

另外对于属性和方法,有一系列符号可以用来标识可见性:

  • + public
  • - private
  • # protected
  • / derived (can be combined with one of the others)
  • ~ package

2.2 Relationship - 关系

在类图中,关系分为两类,一类是对象实例(instance-level)之间的关系:依赖(Dependency),关联(Association),组合(Composition),聚合(Aggregation); 另一类是类(class-level)之间的关系:继承(Inheritance),实现(Implementation)。

下面一一说明一下这些关系的含义以及对应的类图标记:

  • Dependency

dependency
依赖关系用带箭头的虚线表示,代表对象A在运行时会用到对象B,体现在代码中就是A对象在运行时会调用到B对象的方法或使用B对象的属性

注意:我觉得依赖是一种弱关联,仅仅是在A对象的某个状态下会使用到B对象的某些方法,而不是作为A的成员变量,就像下面这段代码:

1
2
3
4
5
6
7
8
import B;
public class A {
public void method1(B b) {
//. . .
}

public void method2() { B tempB = new B }
}
  • Association

Association
关联关系用实线表示,但不一定会带有箭头,这里强调的是一种硬关联的关系,体现在代码中就是成员变量,如果带有箭头,通常表示A知道B,但B不知道A,参考下面的代码:

1
2
3
4
5
6
7
import B;
public class A {
private B b;
public B getB() {
return b;
}
}

另外,关联关系中还有一个关联数量的概念,即我们平常在表达数据库表关系时常用的一对多,多对多,一对一等,参考下表:
multiplicity

  • Aggregation

Aggregation
聚合关系用空心菱形和一个带箭头实线表示,其实聚合也是关联关系对一种,从代码层面理解就是对象A中持有对象B的引用,这种情况下,当A对象被销毁时(回收),B对象仍然存活,就像公司和员工的关系,当公司不存在时,不代表员工也不存在了。

  • Composition

Composition
组合关系和聚合关系有些相似,只是菱形变为实心,这是比聚合关系要更加硬性的一种关联,即当A对象销毁,B对象也随之销毁,A持有B的对象,而非仅仅持有引用,类似于人和心脏的关系,当人不存在了,人的心脏也会随之消失。

  • Inheritance

Inheritance
继承关系用一个带空心箭头的实线表示(有些文档中也使用实心箭头),对象A继承B,这描述的是一种”is a”的关系,即A is a B,就像猫是动物的一种。

  • Implementation

Implementation
实现关系用带空心箭头的虚线表示,它是一种更轻量级的继承关系,从Java代码层面来说,实现都是针对抽象类或接口来说的,如果B实现A,那么A是一个抽象的类,即只是给出了接口的定义,而没有具体的实现逻辑,具体逻辑交给B来实现。

3. 应用示例

这里以抽象工厂模式为例,给出该模式的类图,关于抽象工厂模式这里就不多做介绍了,有兴趣的同学可以到网上查阅相关资料。

抽象工厂模式中包含如下角色:

  • AbstractFactory : 抽象工厂
  • ConcreteFactory : 具体工厂
  • AbstractProduct : 抽象产品
  • Product : 具体产品

AbstractFactory Pattern
上面的类图描述了抽象工厂模式中各个类之间的关系,这里抽象工厂和具体工厂,抽象产品和具体产品之间是实现关系,而具体工厂负责创建具体产品的对象,因此是依赖关系。

4. 总结

关于类图中的元素及用法,这里其实仅仅给出了我个人觉得必要的内容,画类图的目的其实主要是为了更好的描述设计的思路,我觉得不必拘泥于类图的形式,只需要能够清楚的表达自己的设计意图即可,必要时可以在图上做一些自己的标注,但是大体的元素和标签还是应该遵循规范,以便于和其他开发人员进行交流。

参考链接: