学习设计模式就不能不先学习UML类图

学习设计模式就不能不先学习UML类图,在面向对象编程中,类是对某一种具有相同特征的事物的抽象归纳。类图则展示了一组类、接口和协作以及它们之间的关系。类图在系统分析和设计阶段发挥着重要的作用,是编码和测试的重要模型依据。

UML类图由类、接口、注释等基本元素和类与类之间、类与接口之间的关系所组成。首先我们来看基础元素。

1. 类

类的UML图由三部分组成:类名、属性和方法。

类名如果用斜体书写,则代表是抽象类,否则表示是具体的类。

属性描述了类的成员变量以及变量的类型,可以根据需要只列出重要的成员变量。

方法(或操作)描述类的方法以及方法的返回类型,同样可以根据需要只列出重要的方法。

在属性和方法前都可以附加表示访问权限的修饰符。访问权限在面向对象中同样具有非常重要的作用,是面向对象封装性的基础。

修饰符 权限 修饰符 权限
+ public # protected
- private 默认

其中默认权限在Java中表示该属性或方法只能被同一包下的类访问。

下面是一个类的UML图的示例:

35.png

2. 接口

接口其实也是一种特殊的类,因此接口的UML图和类的UML图极为相似,第一部分是接口的名称,必须用斜体表示,顶端要用« interface »修饰。第二部分是接口中的常量。第三部分是方法(操作)。由于接口中的常量和方法都是public的权限,所以在常量和方法名之前都要用加号(+)进行修饰。下面是接口UML图示例:

38.png

3. 注释

UML中用一个右上方带卷角的长方形表示注释,并且用虚线将注释与其所注释的内容相连接。实例如图所示:

41.png

4.继承关系

在UML中用连接两个类的带空心三角形的实线表示继承关系,起始端是子类,终点端是父类,通常父类在上,子类在下。示例如图所示: 44.png 所表示的Java代码为:

public class Father{
	...
} 
class Son extends Father{
	...
}

5.实现关系

一个类实现了一个接口,则该类与该接口之间就是实现关系,在UML中用带空心三角形的虚线连接类与接口,起始端是类,终点端是接口。示例如图: 56.png 所表示的Java代码为:

public interface A{
	void method();
}
class B implements A{
	public void method(){
		...
	}
}

6.依赖关系

如果B类作为参数被A类中的某个方法中使用,则A类和B类的关系就是依赖关系,即A依赖于B。在UML中用带箭头的虚线连接具有依赖关系的两个类,虚线起始端是A,终点端是B。示例如图: 69.png 表示的Java代码为:

public class Person{
    public void work(Bus bus){
	    bus.drive();
    }
}
public class Bus{
    public void drive(){
	    ...
    }
}

7.关联关系

如果B类作为A类的一个属性存在,则A、B之间具有关联关系,称A关联于B。在UML中用带箭头的实线连接两个具有关联关系的类。起始端是A类,终端是B类。关联关系有三种类型,单向关联,双向关联,自关联。 三种关联的UML图:

86.png

8.聚合关系

聚合关系是关联关系的一种(弱关联),与关联不同的是聚合体现的是整体和个体的关系,这里的整体和个体是可以分离的个体可以独立于整体而存在,例如火车站中的火车。二者是has-a的关系。

在UML中用带空心菱形头和箭头的实线表示聚合关系。菱形头指向整体,箭头指向个体。示例如图:

91.png

9.组合关系

组合关系也是关联关系中的一种(强关联),是一种contains-a的关系,一旦整体对象不存在,部分对象也不会存在,部分和整体有着相同的生命周期。代码上表示为A类中的成员变量是B类的申明的对象,B的对象在A对象创建时被创建。

在UML中用带实心菱形和箭头的实线表示组合关系。菱形头指向A类,箭头指向B类。示例如图:

96.png