类图关系线

泛化关系(generalization)

泛化关系使用带空心箭头的实线表示,比如汽车与SUV就是泛化关系;

泛化关系

在代码的实现中,泛化关系表现为继承非抽象类。

实现关系(realize)

实现关系使用空心箭头的虚线表示,比如抽象类和抽象类的实现类关系。

实现关系

在代码的实线中,实现关系表现为继承抽象类(有别与接口的实现)。

聚合关系(aggregation)

聚合关系使用一条带空心菱形箭头的实线(没有箭头)表示。聚合关系用于表示对象之间的关系,表示整体由部分构成的语义,比如一个部门有多个员工构成。

与组合关系有所不同的是,整合和部分不是强依赖,即使整体不存在了,部分仍然存在,比如一个部门撤销了,员工不会消失。

聚合关系

组合关系(composition)

组合关系使用一条实心菱形的实线(没有箭头)表示。与聚合关系一样,组合关系同样用来表示对象之间的关系,但是对象之间是强依赖的。如果整体不存在了那么部分也就不存在。比如公司不存在了那么公司里面的部门也就不存在了。

组合关系

关联关系(association)

关联关系使用一条带方向箭头的实线表示。它描述了不同类对象之间的关系,它是一种静态的关系,通常与运行状态无关,由一般常识等因素决定。关联关系是一种强依赖。

关联关系如果不强调方向(无指向),表对象相互知道(类相互引用)。如果强调方向需要带箭头,比如下图,A指向B,表示A依赖B,A知道B,但是B不依赖A,B不知道A。代码中非常常见,代码表现是B是A的一个成员属性(变量)。

关联关系

在代码中,关联关系通常是以成员变量的形式实现。

依赖关系(dependency)

依赖关系是用一条带箭头 的虚线表示。它描述一个对象在运行期间会用到另外一个对象,比如方法的参数。

与关联关系不同的是,它是一种临时的关系,通常在运行期间产生,并且随着运行时的变化而变化(比如方法的参数是接口,会根据传不同的实现而变化),同时依赖关系也会发生变化。比如传的参数是实现类A变成实现类B。依赖关系由A类变成B类。

显然,依赖也是有双向的,双向依赖是一种非常糟糕的设计,我们总是应该保持单向依赖,杜绝双向依赖(比如类的循环依赖)。

依赖关系

在代码实现中,依赖关系体现为类构造方法的以及普通的方法的传入参数,箭头的指向为调用关系(图中A的方法调用了B),依赖关系除了临时知道对方外,还是“使用”对方的方法和属性。