官方解释为:类图用于描述系统中所包含的类以及它们之间的相互关系,帮助人们简化对系统的理解,它是系统分析和设计阶段的重要产物,也是系统编码和测试的重要模型依据。
在UML中,类使用包含类名、属性和操作且带有分隔线的长方形来表示,如定义一个Employee类,它包含属性name、age和email,以及操作modifyInfo(),在UML类图中该类如图1所示:
对应的代码如下
public class Employee {
private String name;
private int age;
private String email;
public void modifyInfo() {
......
}
}
类图分三层,
第一层显示类的名称,如果是抽象类,就用斜体显示
第二层,为类的特性,通常就是字段和属性
第三层是类的操作,通常是方法或者行为。
第三部分是类的操作(Operations):操作是类的任意一个实例对象都可以使用的行为,是类的成员方法。
UML规定操作的表示方式为:
可见性 名称(参数列表) [ : 返回类型]
其中:
“ + ” 表示 public “ - ” 表示 private “ # ” 表示 protected
方法method1 对应代码
public void method1(Object par) {
do something ......
}
操作method1的可见性为public(+),带入了一个Object类型的参数par,返回值为空(void);
操作method2的可见性为protected(#),无参数,返回值为String类型;
操作method3的可见性为private(-),包含两个参数,其中一个参数为int类型,另一个为int[]类型,返回值为int类型。
图片为标准类图关系类型的定义,太过于抽象化,下面我会列出一些常用的通俗关系
1.继承关系 : 空心三角形 + 实线
如下图所示中,Student类与Teacher类继承了Person类
//父类
public class Person {
protected String name;
protected int age;
public void move() {
……
}
public void say() {
……
}
}
//子类
public class Student extends Person {
private String studentNo;
public void study() {
……
}
}
//子类
public class Teacher extends Person {
private String teacherNo;
public void teach() {
……
}
}
2.接口关系:空心三角形 + 虚线
如下图中,Car类与Ship类都实现了Vehicle接口。
public interface Vehicle {
public void move();
}
public class Ship implements Vehicle {
public void move() {
……
}
}
public class Car implements Vehicle {
public void move() {
……
}
}
3. 关联关系 :
a.单向关联 实线箭头
例如:顾客(Customer)拥有地址(Address),则Customer类与Address类具有单向关联关系,如图3所示:
public class Customer {
private Address address;
……
}
public class Address {
……
}
b.双向关联 实线
例如:顾客(Customer)购买商品(Product)并拥有商品,反之,卖出的商品总有某个顾客与之相关联。因此,Customer类和Product类之间具有双向关联关系
public class Customer {
private Product[] products;
……
}
public class Product {
private Customer customer;
……
}
c. 自关联
用一个带有箭头且指向自身的直线表示。
上图的意思就是Node类包含类型为Node的成员变量,也就是“自己包含自己”。
4.聚合关系 空心的菱形 + 实线箭头
例如:汽车发动机(Engine)是汽车(Car)的组成部分,但是汽车发动机可以独立存在,因此,汽车和发动机是聚合关系
在代码实现聚合关系时,成员对象通常作为构造方法、Setter方法或业务方法的参数注入到整体对象中,图6对应的Java代码片段如下:
public class Car {
private Engine engine;
//构造注入
public Car(Engine engine) {
this.engine = engine;
}
//设值注入
public void setEngine(Engine engine) {
this.engine = engine;
}
……
}
public class Engine {
……
}
5.组合关系 实心的菱形 + 实线箭头
例如:人的头(Head)与嘴巴(Mouth),嘴巴是头的组成部分之一,而且如果头没了,嘴巴也就没了,因此头和嘴巴是组合关系
public class Head {
private Mouth mouth;
public Head() {
mouth = new Mouth(); //实例化成员类
}
……
}
public class Mouth {
……
}
6.依赖关系 虚线箭头
动物依赖于氧气和水。他们之间是依赖关系
public abstract class Animal{
public Metabolism (Oxygen oxygen, Water water){
}
//do something .......
}
编程是一门技术,更加是一门艺术。UML 类图也不是一学就会的,需要有一个慢慢熟练的过程。所谓学无止境。大家加油!!
参考
http://www.uml.org.cn/oobject/201211231.asp