类图是最常用的UML图形,也是开发人员在设计和修改代码时的重要工具。下面介绍一下常用图形:
1.类
面向对象编程中,类是对象的骨架,它了包含3个组成部分:
第一个是Java中定义的类名。
第二个是属性(attributes)。
第三个是该类提供的方法。
对于标准的UML类图,他的第一行表示类的名称,如下图的annimal。
第二行是类的属性,也就是它的成员变量,如name、age、trueName、sex这四个属性。
第三行表示类的方法,如getName()和setName()方法。
当然,他们都是有可见范围的。
在UML类图中,加号(+)表示具有公共可见性(public)。减号(-)表示私有可见性(private)。#号表示受保护的可见性(protected)。
省略这些修饰符表示具有package(包)级别的可见性。
如果属性或操作具有下划线,表明它是静态的。在操作中,可同时列出它接受的参数,以及返回类型,如图:
对应代码如下:
1 public class Annimal { 2 public String name; 3 private int age; 4 protected String trueName; 5 String sex; 6 7 public String getName() { 8 return name; 9 } 10 11 private void setName(String name) { 12 this.name = name; 13 } 14 }
2.接口
接口是一系列操作的集合,它指定了一个类所提供的服务。它直接对应于Java中的一个接口类型。
接口既可用下图的那个图标来表示,也可由附加了<<interface>>的一个标准类来表示。
通常,根据接口在类图上的样子,就能知道与其他类的关系。
对应代码如下:
1 public interface CollegePerson { 2 public void getSchedule(); 3 }
3.关系
3.1 依赖关系
实体之间一个“使用”关系暗示一个实体的规范发生变化后,可能影响依赖于它的其他实例。
更具体地说,它可转换为对不在实例作用域内的一个类或对象的任何类型的引用。
其中包括一个局部变量,对通过方法调用而获得的一个对象的引用(实例方法返回值),或者对一个类的静态方法的引用(静态方法返回值)。
也可利用“依赖”来表示包和包之间的关系。由于包中含有类,所以你可根据那些包中的各个类之间的关系,表示出包和包的关系。
对应代码如下:
1 public class Annimal { 2 3 public String name; 4 private int age; 5 protected String trueName; 6 String sex; 7 8 public String getName() { 9 return name; 10 } 11 12 private void setName(String name) { 13 this.name = name; 14 } 15 16 public void drink(Water water) { 17 18 } 19 } 20 21 class Water{ 22 private String name; 23 }
3.2关联
实体之间的一个结构化关系表明对象是相互连接的。箭头是可选的,它用于指定导航能力。
如果没有箭头,暗示是一种双向的导航能力。
在Java中,关联转换为一个实例作用域的变量,如下图所示。
可为一个关联附加其他修饰符。多重性(Multiplicity)修饰符暗示着实例之间的关系。
在示范代码中,Employee可以有0个或更多的TimeCard对象。但是,每个TimeCard只从属于单独一个Employee。
代码如下:
1 public class Employee { 2 3 public Employee() { 4 // TODO Auto-generated constructor stub 5 } 6 7 private TimeCard timeCard; 8 9 } 10 11 class TimeCard { 12 13 }
3.2.1 聚合
聚合是关联的一种形式,代表两个类之间的整体/局部关系。组合是一种比较紧密的关系,整体和局部“同生共死”。
聚合暗示着整体在概念上处于比局部更高的一个级别,而关联暗示两个类在概念上位于相同的级别。聚合也转换成Java中的一个实例作用域变量。
代码如下:
1 public class People { 2 3 public People() { 4 // TODO Auto-generated constructor stub 5 } 6 private Person person; 7 } 8 9 class Person{ 10 11 }
3.2.2 组合
合成是聚合的一种特殊形式,暗示“局部”在“整体”内部的生存期职责。合成也是非共享的。
所以,虽然局部不一定要随整体的销毁而被销毁,但整体要么负责保持局部的存活状态,要么负责将其销毁。
局部不可与其他整体共享。但是,整体可将所有权转交给另一个对象,后者随即将承担生存期职责。
代码如下:
1 public class People { 2 3 public People() { 4 // TODO Auto-generated constructor stub 5 } 6 private Person person1; 7 private Person person2; 8 } 9 10 class Person{ 11 12 }
3.2.3 泛化
泛化表示一个更泛化的元素和一个更具体的元素之间的关系(子类继承父类)。泛化是用于对继承进行建模的UML元素。在Java中,用extends 关键字来直接表示这种关系。
代码如下:
1 public abstract class Annimal { 2 3 public String name; 4 private int age; 5 protected String trueName; 6 String sex; 7 8 public String getName() { 9 return name; 10 } 11 12 private void setName(String name) { 13 this.name = name; 14 } 15 16 public abstract void drinkWater(Water water); 17 } 18 19 class Cat extends Annimal{ 20 21 @Override 22 public void drinkWater(Water water) { 23 // TODO Auto-generated method stub 24 25 } 26 27 } 28 29 class Water{ 30 private String name; 31 }
3.2.4 实现
实例关系指定两个实体之间的一个合同。换言之,一个实体定义一个合同,而另一个实体保证履行该合同。(子类继承接口)
对Java应用程序进行建模时,实现关系可直接用implements关键字来表示。
代码如下:
1 public interface IAnnimal { 2 public void drinkWater(Water water); 3 } 4 5 class Cat implements IAnnimal{ 6 7 @Override 8 public void drinkWater(Water water) { 9 // TODO Auto-generated method stub 10 11 } 12 }