本篇主要介绍UML的类图(Class Diagram),类图主要是为了图形化的展示静态结构模型,主要显示类、接口以及它们的内部结构和关系。只描述抽象的类结构和相互关联,这些类型具体的对象实例信息主要在对象图和交互图中得到体现。
下面主要介绍类图中的相关模型,同时建模与编码(以Java为案例,后续不再强调)做实现类比,注意建模可以实现编码实现的功能,并不代表建模一定要细化到和编码实现一样的程度。
类(Class)
通过属性(Property)、方法(Operation)、接收(Reception)、端口(Port)描述结构定义
模型:

+ : public
- : private
# : protected
~ : package
编码:
public enum CoolingEnum {
WIND("风冷"),
WATER("水冷");
private String type;
CoolingEnum(String type) {
this.type = type;
}
}
类(Class)模型与编码对比时,可以明显发现模型属性(Property)对应编码的属性,模型操作(Operation)对应编码的方法
属性(Property)
定义结构的字段属性,主要有两种场景,一种是主动创建定义属性,一种是创建关联时自动创建一个属性用来承载关联另一端(属性类型是关联另一端的类结构,通过属性描述类与类之间的关联关系)
属性主要操作是设置类型,设置多重性,设置默认值
设置类型:
类型设置主要分两种场景:
1、数据类型(DataType),基础类型(PrimitiveType)、枚举(Enumeration)也都是DataType
2、非数据类型(除Datatyp外的Type类型模型,主要是类[Class],DataType也是Type)
设置多重性:
决定属性是空、单个、指定大小列表或无限制列表
设置默认值:
设置默认值,根据类(Class)创建对象实例(Instance Specification)时,该对象实例(Instance Specification)的此属性提前设置一个默认值。
如果类(Class)与类(Class)之间存在泛化时,子类结构创建对象实例(Instance Specification)时可以获取父类结构的所有属性,子类结构上可以进行重写父类结构属性的操作
除此之外,属性模型规范上还提供了很多属性用来标记该属性的特性,此处不一一展开,具体可查看OMG的UML标准规范文档(本系统博客主要针对UML模型的使用进行功能性描述说明,下一系列博客会针对UML的规范文档进行规范性描述说明)。
模型:
编码:
public class PetrolEngine extends Engine {
// 定价
public List<Double> pricing = Arrays.asList(30.0);
// 缸数(重写)
public Integer cylindersNumber;
}
操作(Operation)
操作(Operation),其方法(Method)可以绑定一种行为用来描述此操作,其整体效果可实现与编码的方法类似的功能,操作(Operation)对应编码的方法定义,操作(Operation)的方法(Method)绑定的行为模型对应编码的方法体实现细节。
此外额外进行拓展说明:此处只是设置操作定义的地方,其方法细节(Method)需要行为的相关模型元素描述(例如Opaque Behavior、Activity等),其操作调用使用场景需要逻辑仿真的支持
下面以三种调用场景为例进行说明(此处不细说行为相关的模型,具体细节行为图类进行说明):
- 外部传参方法 + 使用Opaque Behavior描述Method内部
模型:
编码:
// 计算加速度
public Double calculateAcceleration(Double v, Double t) {
Double result = v / t;
System.out.println(result);
return result;
}
- 外部传参方法 + 使用Activity描述Method内部
模型:
编码:
// 计算转速
public Double calculateRev(Double f, Integer p) {
Double result = 60*(f / p);
System.out.println(result);
return result;
}
- 内部属性处理方法 + 使用Activity描述Method内部(仿真过程中可以根据表达式解析到对应实例的属性)
模型:
编码:
// 计算总缸数
public Integer calculateRev() {
return cylindersNumber * averageCylindersNumber;
}
接口(Interface)
接口是类、组件、子系统等分类器(Classifier)的外部可见操作(Operation)的定义,没有内部结构的说明。接口由分类器(Classifier)进行操作(Operation)的实现
模型的接口与编码接口概念类似,本质都是广义上的接口概念的两种实现。
模型:
编码:
public interface IEngine {
public Double calculateAcceleration(Double v, Double t);
public Double calculateRev(Double f, Integer p);
}
public class Engine implements IEngine {
// 缸数
public Integer cylindersNumber;
// 每缸气门数
public Integer averageCylindersNumber;
// 冷却方式
protected CoolingEnum coolingType;
// 发动机排量
String engineCapacity;
// 计算加速度
@Override
public Double calculateAcceleration(Double v, Double t) {
Double result = v / t;
System.out.println(result);
return result;
}
// 计算转数
@Override
public Double calculateRev(Double f, Integer p) {
Double result = 60*(f / p);
System.out.println(result);
return result;
}
// 计算总缸数
public Integer calculateRev() {
return cylindersNumber * averageCylindersNumber;
}
}
数据类型(DataType)
DataType存在两种子集:
- 原始类型(PrimitiveType):纯值数据的模型定义,不包含子的UML结构(例如String、Integer、Real)
- 枚举(Enumeration):枚举的模型定义
除了原始类型(PrimitiveType)和枚举(Enumeration)的使用场景特殊,其他Type类型的类型定义使用场景都是属性的类型为模型,值为模型的实例(如果是元模型的话,元模型作为类型时,实例是指这种类型的模型InstanceSpecification;
由于原始类型(PrimitiveType)和枚举(Enumeration)也是Type类型,如果工具未加以限制会错误使用这两种模型类型,即这两种类型下定义子的UML结构,直接作为Type类型使用)
模型:
编码:
Java的基础类型(int、double等)
public enum CoolingEnum {
WIND("风冷"),
WATER("水冷");
private String type;
CoolingEnum(String type) {
this.type = type;
}
}
Java的HashMap
public class EngineSystem {
// 燃油发动机
public Engine fuelOil;
// 电力发动机
public Engine electricity;
}
泛化(Generalization)
泛化(Generalization)表示抽象的分类器(Classfier)到更具体的分类器(Classfier),泛化的概念与编码的继承类似,汽油发动机(具体)继承至发动机(抽象)对应发动机(抽象)泛化汽油发动机(具体)(或者汽油发动机泛化至发动机)
泛化线由具体的分类器指向抽象的分类器
模型:
编码:
public class PetrolEngine extends Engine {
// 定价
public List<Double> pricing = Arrays.asList(30.0);
// 缸数(重写)
public Integer cylindersNumber;
}
关联 (Association)
关联模型主要存在三种概念:
1.关联关系:是整体与部分的关系。
2.聚合关系:是整体与部分的关系,部分能脱离整体而独立存在。
3.组合关系:是整体与部分的关系,但部分不能脱离整体而独立存在。
耦合程度:组合 > 聚合 > 关联
模型:
编码:
public class EngineSystem {
// 燃油发动机
public Engine fuelOil;
// 电力发动机
public Engine electricity;
}
同上,对应成员变量处理同上,对应成员变量处理
实现(Realization)
实现(Realization)模型的子集存在三种:
- 接口实现(Interface Realization):
接口实现是分类器和接口之间的特殊实现关系。这种关系表示分类器实现符合接口规定。 - 组件实现(Component Realization):
组件和分类器之间的关系 - 代换(Substitution):
两个分类器之间的关系。