UML类图及其关系

在UML类图中, 常见的关系有一下几种: 泛化(Generalization), 实现(Realization), 关联(Association), 聚合(Aggregation), 组合(Composition), 依赖(Dependency).

示例
类图
请看下面的类图

在这里插入图片描述
车的类图结构为abstract,表示车是一个抽象类;
它有两个继承类:汽车和自行车;它们之间的关系为实现关系,使用带空心箭头的虚线表示;通常用来表示接口的实现;
汽车为与SUV之间也是继承关系,它们之间的关系为泛化关系,使用带空心箭头的实线表示;通常用来表示类的继承
小汽车与发动机之间是组合关系,使用带实心箭头的实线表示;
学生与班级之间是聚合关系,使用带空心箭头的实线表示;
学生与身份证之间为关联关系,使用一根实线表示;
学生上学需要用到自行车,与自行车是一种依赖关系,使用带箭头的虚线表示;


类与类之间的表达关系

 类与类之间关系

 


关系小结
UML类图几种关系的总结,泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖

类之间的关系


泛化(Generalization)
类的继承结构表现在UML中为:泛化(generalize)与实现(realize):

继承关系为 is-a的关系;两个对象之间如果可以用 is-a 来表示,就是继承关系:(…是…)

eg:自行车是车、猫是动物

泛化关系用一条带空心箭头的直接表示;如下图表示(A继承自B);

继承关系

 

eg:汽车在现实中有实现,可用汽车定义具体的对象;汽车与SUV之间为泛化关系;

在这里插入图片描述

 


注:最终代码中,泛化关系表现为继承非抽象类

实现
实现关系用一条带空心箭头的虚线表示;
eg: "车"为一个抽象概念,在现实中并无法直接用来定义对象;只有指明具体的子类(汽车还是自行车),才 可以用来定义对象(在JAVA中有接口这个概念)

在这里插入图片描述
注:最终代码中,实现关系表现为继承抽象类;

 

组合
组合关系用一条带实心菱形箭头直线表示,如下图表示A组成B,或者B由A组成;

在这里插入图片描述

 

组合关系同样表示整体由部分构成的语义;比如公司由多个部门组成;

组合关系为 contain-a的关系;两个对象之间如果可以用 contain-a 来表示,就是组合关系:(…包含…)

但组合关系是一种强依赖的特殊聚合关系,如果整体不存在了,则部分也不存在了;例如, 大雁与翅膀的关系, 大雁没了, 翅膀也没了;

聚合
聚合关系用一条带空心菱形箭头的直线表示,如下图表示A聚合到B上,或者说B由A组成;

在这里插入图片描述

 

聚合关系用于表示实体对象之间的关系,表示整体由部分构成的语义;例如雁群与大雁的关系;

聚合关系为 has-a的关系;两个对象之间如果可以用 has-a 来表示,就是聚合关系:(…有…)

与组合关系不同, 聚合关系整体与部分不是强依赖关系, 即使整体不存在了,部分依然存在, 例如: 大雁与雁群, 即使雁群不存在, 大雁依旧存在

关联
关联关系是用一条直线表示的;它描述不同类的对象之间的结构关系;它是一种静态关系, 通常与运行状态无关,一般由常识等因素决定的;它一般用来定义对象之间静态的、天然的结构; 所以,关联关系是一种“强关联”的关系;

比如,乘车人和车票之间就是一种关联关系;学生和学校就是一种关联关系;

单向关联
关联关系默认不强调方向,表示对象间相互知道;如果特别强调方向也可以使用箭头实线; 如 Customer -> Address, 表示Customer知道Address,但 Address不知道Customer;

public class Customer  {  
    private Address address;  
    // ……  
}  

public class Address  {  
    // ……  
}  


注:在最终代码中,关联对象通常是以成员变量的形式实现的;

双向关联
默认情况下,关联是双向的, 常见的Hibernate中的多对多

public class Student  {  
    private IdCard idCard;  
    // ……  
}  

public class IdCard  {  
    private Student student;  

    // ……  
}  


自关联
在系统中可能会存在一些类的属性对象类型为该类本身,这种特殊的关联关系称为自关联, 如链式结构;

自关联

public class LinkNode  {  
    private LinkNode parentNode;
    private LinkNode children;  
    ……  
}  


重数性关联(Multiplicity)
重数性关联关系又称为多重性关联关系(Multiplicity),表示一个类的对象与另一个类的对象连接的个数。在UML中多重性关系可以直接在关联直线上增加一个数字表示与之对应的另一个类的对象的个数。

 

表示方式    多重性
1…1    表示两个类的关联关系一一对应
0…*    表示一个类型对象与0个和多个该类对象有关系
1…*    表示一个类型对象与1个和多个该类对象有关系
m…n    表示一个类的一个对象与最少m、最多n个该类对象有关系 (m<=n)


依赖
依赖关系是用一套带箭头的虚线表示的;如下图表示A依赖于B;他描述一个对象在运行期间会用到另一个对象的关系;

依赖关系图
与关联关系不同的是,它是一种临时性的关系,通常在运行期间产生,并且随着运行时的变化; 依赖关系也可能发生变化;

 

显然,依赖也有方向,双向依赖是一种非常糟糕的结构,我们总是应该保持单向依赖,杜绝双向依赖的产生

在这里插入图片描述

public class Student  {  
    public void cycling(Bicycle bicycle) {  
        bicycle.move();  
    }  
    // ……  
}  
public class Bicycle  {  
    public void move() {  
        // ......  
    }  
    // ……  
}  


依赖关系有如下三种情况:

 

A类是B类中的(某中方法的)局部变量;
A类是B类方法当中的一个参数;
A类向B类发送消息,从而影响B类发生变化;
 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值