UML(统一建模语言)是一种面向对象的可视化建模语言。UML提供9种视图:类图、对象图,用例图,序列图、协作图,状态图、活动图,构件图和部署图。在这里重点介绍UML语言中的类图。
UML类图是描述程序中类的关系的一种图。
类图包含以下关系:
零、类、属性和方法
类图包含属性、方法
1、类
类有一些版型类,例如接口、模板类、嵌套类、行为类等
在MVC中,有边界类,实体类和控制类
(0)边界类、实体类和控制类
三种图
(1)抽象类
抽象类可以用斜体表示或用版型的概念
(2)接口
我们建议使用第一种表示方法
(3)关联类
(4)模板类
(5)行为类
在类的两边加上竖线可以表达出行为类(Active Class)
(6)嵌套类
2、属性
如果在属性中加上下划线,则表示是static关键字。如果在类中加上多重性表达,则说明在会创建多少个实例对象(instance)
3、方法
说明了这个类可以提供的服务
二、类之间的关系
1、泛化关系(Generalization)
在Java中,泛化关系是一种最强的关联关系,使用extends关键字。它指定了子类如何特化了父类的行为,例如,老虎是一种动物。
public class Animal{
}
public class Tiger extends Animal{
}
在UML类图中,子类和父类用一条带三角形箭头的实线连接,三角箭头指向父类。在这里使用UML工具进行演示。
2、实现关系(Realization)
在Java中,实现关系使用implement关键字。在实现关系中,类对接口的行为进行实现。例如,我们可以定义一个交通工具接口Vehicle,其中有一个抽象操作move(),类Ship和Train可以对接口Vehicle进行实现。
public interface Vehicle{
void move();
}
public class Ship implement Vehicle{
@Override
public void move(){
...
}
}
public class Train implement Vehicle{
@Override
public void move(){
...
}
}
在UML类图中,类和接口用一条带三角形箭头的虚线连接,三角箭头指向接口。
3、关联关系(Association)
关联关系是一种拥有的关系,它使一个类拥有另一个类的成员变量和成员方法,一般体现就是一个类是另一个类的成员变量。(关联线上可以有注释)
关联约束:
(可以标上以什么身份参与关联)
关联类
关联角色:(以什么身份参与关联)
在关联关系中,有以下几种关联关系:
(1)双向关联
例如,一个顾客可以购买多种商品,一个商品同时也被多个顾客关联,这就是简单的双向关联关系。
public class Customer{
public Production p;
...
}
public class Production{
public Customer c;
...
}
在UML类图中,双向关联的两个类使用一条实线连接。
(2)单向关联
类的关联也可以是单向的,例如一个学生可以拥有多门课,但是抽象的课不能拥有学生。这就是一个简单的单向关联关系。
public class Student{
public Lessson p;
...
}
public class Lesson{
...
}
在UML类图中,单项关联的两个类使用一条带箭头的实线,箭头指向被拥有者。
(3)自关联
有时候类也可以关联自身,即这个类的成员变量中就包含自身这个类。例如数据结构中,树的节点的成员变量就有节点这个类。
public class Node{
private Node nextNode;
...
}
在UML类图中,自关联用一条带箭头的实线指向自身。
(4)多重性关联(与属性的多重性)
在关联关系中,多重性关联常常被使用,它表示一个类中包含另一个类,另一个类也包含这个类,并且包含类的数量是零个、一个或多个。例如,一个界面可以有零个或多个按钮(Button类),但一个按钮只能对应一个界面(Form类)
public class Form{
private Button[] buttons;
...
}
public class Button{
private Form form;
...
}
在UML类图中,多重性关联直接在关联直线上增加一个数字表示与之对应的另一个类的对象数量。
4、聚合关系(Aggregation)
聚合关系表示整体与部分的关系,是一种更强的关联关系。聚合关系中对象成员可以脱离整体独立存在。例如,发动机是汽车的一部分,但是发动机也可以独立于汽车存在。
public class Car{
private Engine engine;
public Car(Engine e){
this.engine=e;
}
public void set(Engine e){
this.engine=e;
}
}
public class Engine{
...
}
在以上代码中,由于car和engine的实例化时刻不同,Car中并不直接实例化Engine,而是通过构造函数或set方法进行传值,这种传值方式叫做注入(Injection)
在UML类图中,聚合关系使用带空心菱形的实心线,菱形指向整体。
5、组合关系(Composition)
组合关系表示整体与部分的关系,是一种比聚合关系还要强的关系。组合关系中对象成员不能够脱离整体独立存在。例如,部门是公司的一部分,但是部门不能脱离公司共同存在。
public class Company{
private Department department;
public Company(){
department=new Department();
}
}
public class Department{
...
}
在组合关系下,成员类是整体类的一部分,成员类的构造函数在整体类的构造函数中调用。
在UML类图中,组合关系使用带实心菱形的实心线,菱形指向整体。
6、依赖关系(Dependency)
依赖关系是一种使用的关系,在需要表示一个事物使用另一个事物时使用依赖关系,大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数。例如驾驶员开车,在Driver类中的drive方法需要接收参数car,并调用car中的move方法,这就是一个简单的依赖关系。
public class Driver{
public void drive(Car c){
c.move();
}
}
public class Car{
...
}
在UML类图中,依赖关系用带箭头的虚线表示。箭头指向被使用的类。
各种关系的强弱顺序
泛化=实现>组合>聚合>关联>依赖
三、类图的三个抽象层次
1、概念层
只有类的名字
2、说明层(Specification)
只需要列出属性和操作的名字
3、实现层(Implementation)
更加具体