java程序员的角度阐述UML和对象建模问题,是一个深入浅出的实用性介绍。虽然从历史和基本理念方面来探讨UML非常吸引人,但我们还是直接从Java代码开始,看看UML如何描述Java类,再在叙述过程中插入一些历史和基本理念方面的知识。
UML类图
在Java中,我们用下面的代码声明两个公用类,每一个Java类放入一个文件,文件的名字就是Java类的名字加上扩展名.java:
public class Person{}
public class Organization{}
UML是Unified Modeling Language的缩写,即“统一建模语言”。与Java不同,UML是一种图形化的建模“语言”,它用一个矩形来表示一个类,在矩形的内部写上类的名称,一个类图可以放入多个类。用矩形表示类,是UML中U(Unified)起的作用。在UML的第一个版本出现,每一个对象建模专家都有自己的一套符号,一些人用点表示类,一些人用圆圈表示类,还有一些人用圆角矩形表示类。显然,这很轻易引起混乱。后来,Rational公司的三个专家——Grady Booch、James Raumbaugh、Ivar Jacobson达成了一致意见,同意“统一”他们各自使用的符号,UML终于创立,符号之争也终于落下了帷幕。图一就是上面两个Java类的UML类图:
图一 有二个类的简单类图
假如要描述一系列类的内部结构以及它们相互之间的关系,UML类图是非常有用的。例如,在许多书籍中,我们可以看到作者用类图来描述各个类之间的关系。
显然,空的类没有什么实际意义。我们要为Person类加上一些实例变量和简单的方法。下面是Person类的代码,已经过简化处理,不含任何注释:
public class Person {
PRivate String name;
private String socialSecurityNumber;
private Date dateOfBirth;
private String emailAddress;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getSocialSecurityNumber()
{ return socialSecurityNumber; }
public void setSocialSecurityNumber(String socialSecurityNumber)
{ this.socialSecurityNumber = socialSecurityNumber; }
public Date getDateOfBirth() { return dateOfBirth; }
public void setDateOfBirth(Date dateOfBirth)
{ this.dateOfBirth = dateOfBirth; }
public int calcAgeInYears()
{/*not implemented yet*/return 0;}
}
图二显示了Person类的UML图。可以看到,UML用“+”和“-”符号分别表示public和private修饰符。UML只显示操作和属性类型之类的特征信息,操作的结果在行未的冒号之后声明。
图二 在UML类图中描述属性和方法
由于UML类图不包含方法的具体实现,所以在UML类图中查看属性和方法等基本信息要比直接查看Java源代码更方便一些。在创建UML图时,人们经常忽略或隐藏各种细节信息,以便查看和把握类的整体结构。例如,UML类图经常只显示出属性和操作的名称,简单的访问器方法(诸如getXXX()、setXXX()之类的方法)也经常不显示出来。图三就是简化图二得到的结果。
图三 经过简化的Person类UML图
图三清楚地显示出了Person类主要的属性和方法。但是,单个类的UML图还不是很有用。只有包含多个类且描述了多个类之间关系的UML图,才具有实用意义。UML用两个类之间的连线来表示两者之间的关系,不同的线型表示不同的关系,在UML类图中最常见的关系是关联关系。
关联关系
前面Person类的属性都是简单类型(Primitive Type),或者说是Java直接提供的标准类型。现在来考虑下面的代码片断,它增加了一个对Organization实例的引用:
public class Person {...
private Organization employer;
...
}
引用的名称是employer,意味着这里的Organization代表着Person的雇主。图四显示了如何在UML中描述这种关系:
图四 两个类之间的关联关系两个类之间的连线表示Person类对Organization类有一种依靠关系。这条线是一条实线(而不是虚线),表示这种依靠关系是一种关联。
如有必要,关联关系可显示出角色、多重性、关联方向等属性。图四的关联关系显示出Organization对象在该关系中是雇主的角色,“0..1”表示每一个Person类的对象最多和一个Organization类的对象有关系,也可能和0个Organization对象有关系(即Person对Organization的引用可设置为null)。开叉的箭头表示Person类拥有对Organization的引用,而不是Organization拥有对Person的引用。Java程序员的角度阐述UML和对象建模问题,是一个深入浅出的实用性介绍。虽然从历史和基本理念方面来探讨UML非常吸引人,但我们还是直接从Java代码开始,看看UML如何描述Java类,再在叙述过程中插入一些历史和基本理念方面的知识。
UML类图
在Java中,我们用下面的代码声明两个公用类,每一个Java类放入一个文件,文件的名字就是Java类的名字加上扩展名.java:
public class Person{}
public class Organization{}
UML是Unified Modeling Language的缩写,即“统一建模语言”。与Java不同,UML是一种图形化的建模“语言”,它用一个矩形来表示一个类,在矩形的内部写上类的名称,一个类图可以放入多个类。用矩形表示类,是UML中U(Unified)起的作用。在UML的第一个版本出现,每一个对象建模专家都有自己的一套符号,一些人用点表示类,一些人用圆圈表示类,还有一些人用圆角矩形表示类。显然,这很轻易引起混乱。后来,Rational公司的三个专家——Grady Booch、James Raumbaugh、Ivar Jacobson达成了一致意见,同意“统一”他们各自使用的符号,UML终于创立,符号之争也终于落下了帷幕。图一就是上面两个Java类的UML类图:
图一 有二个类的简单类图
假如要描述一系列类的内部结构以及它们相互之间的关系,UML类图是非常有用的。例如,在许多书籍中,我们可以看到作者用类图来描述各个类之间的关系。
显然,空的类没有什么实际意义。我们要为Person类加上一些实例变量和简单的方法。下面是Person类的代码,已经过简化处理,不含任何注释:
public class Person {
private String name;
private String socialSecurityNumber;
private Date dateOfBirth;
private String emailAddress;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getSocialSecurityNumber()
{ return socialSecurityNumber; }
public void setSocialSecurityNumber(String socialSecurityNumber)
{ this.socialSecurityNumber = socialSecurityNumber; }
public Date getDateOfBirth() { return dateOfBirth; }
public void setDateOfBirth(Date dateOfBirth)
{ this.dateOfBirth = dateOfBirth; }
public int calcAgeInYears()
{/*not implemented yet*/return 0;}
}
图二显示了Person类的UML图。可以看到,UML用“+”和“-”符号分别表示public和private修饰符。UML只显示操作和属性类型之类的特征信息,操作的结果在行未的冒号之后声明。
图二 在UML类图中描述属性和方法
由于UML类图不包含方法的具体实现,所以在UML类图中查看属性和方法等基本信息要比直接查看Java源代码更方便一些。在创建UML图时,人们经常忽略或隐藏各种细节信息,以便查看和把握类的整体结构。例如,UML类图经常只显示出属性和操作的名称,简单的访问器方法(诸如getXXX()、setXXX()之类的方法)也经常不显示出来。图三就是简化图二得到的结果。
图三 经过简化的Person类UML图
图三清楚地显示出了Person类主要的属性和方法。但是,单个类的UML图还不是很有用。只有包含多个类且描述了多个类之间关系的UML图,才具有实用意义。UML用两个类之间的连线来表示两者之间的关系,不同的线型表示不同的关系,在UML类图中最常见的关系是关联关系。
关联关系
前面Person类的属性都是简单类型(Primitive Type),或者说是Java直接提供的标准类型。现在来考虑下面的代码片断,它增加了一个对Organization实例的引用:
public class Person {...
private Organization employer;
...
}
引用的名称是employer,意味着这里的Organization代表着Person的雇主。图四显示了如何在UML中描述这种关系:
图四 两个类之间的关联关系两个类之间的连线表示Person类对Organization类有一种依靠关系。这条线是一条实线(而不是虚线),表示这种依靠关系是一种关联。
如有必要,关联关系可显示出角色、多重性、关联方向等属性。图四的关联关系显示出Organization对象在该关系中是雇主的角色,“0..1”表示每一个Person类的对象最多和一个Organization类的对象有关系,也可能和0个Organization对象有关系(即Person对Organization的引用可设置为null)。开叉的箭头表示Person类拥有对Organization的引用,而不是Organization拥有对Person的引用。