带你了解软件工程中的类与类的关系

一、UML图

1.UML图简介

  • UML——Unified modeling language UML(统一建模语言),是一种用于软件系统分析和设计的语言工具,它用于帮助软件开发人员进行思考和记录思路等
  • UML本身是一套符号的规定,就像数学符号和化学符号一样,这些符号用于描述软件模型中的各个元素和他们之间的关系,比如类、接口、实现、泛化、依赖、组合、聚合等
  • 使用UML来建模,常用的工具有很多,如:StarUML、Rational Rose、PowerDesigne等。也可以使用IDEA或Eclipe的插件来建模
  • 画UML图与写文章差不多,都是把自己的思想描述给别人看,关键在于思路和条理

2.UML图分类

  1. 用例图(use case)
  2. 静态结构图:类图、对象图、包图、组件图、部署图
  3. 动态行为图:交互图(时序图与协作图)、状态图、活动图

3.类图

类图可以直观的表示出类与类的关系

带你了解软件工程中的类与类的关系

PS:本文主要讲解类与类的关系,UML图并没有做过多讲解

二、六大关系

1.依赖关系(Dependence)

  • 只要是在类中用到了对方,那么他们之间就存在依赖关系。
  • 单向,表示一个类依赖于另一个类的定义,其中一个类的变化将影响另外一个类,是一种“use a”关系
  • 如果A依赖于B,则B表现为A的局部变量,方法参数,静态方法调用或方法的返回类型等
    带你了解软件工程中的类与类的关系

注:PersonDao与PersonServiceBean为聚合关系

2.泛化关系(Generalization)

  • 说白了讲就是继承关系
  • 即"is a"关系,类继承抽象类,类继承父类都属于这种关系
  • 如果A继承B,我们就说A和B存在泛化关系
  • 泛化关系可以看成是依赖关系的特例
    带你了解软件工程中的类与类的关系

3.实现关系(Realization)

  • 说白了讲就是A类实现B类
  • 类实现接口属于这种关系
  • 实现关系可以看成依赖关系的特例
    带你了解软件工程中的类与类的关系

PS:注意,这张图中的直线是虚线,可能不太明显

4.关联(Association)

  • 是一种拥有的关系.
  • 通常表现为成员变量。
  • 关联可分为双向关联和单向关联。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。
  • 关联关系可以看成是依赖关系的特例

5.聚合(Aggregation)

  • 聚合关系表示的是整体和部分的关系,整体与部分可以分开,且整体与部分分离后可以单独存在。所以他具有关联的导航性与多重性。
  • 通常变现为成员变量。
  • 聚合关系是关联关系的特例
    带你了解软件工程中的类与类的关系

6.组合(Composition)

  • 是整体与部分的关系,但部分不能离开整体而单独存在。如公司和部门是整体和部分的关系,没有公司就不存在部门。
  • 通常变现为成员变量。
  • 组合关系是关联关系的特例,是比聚合关系还要强的关系。
    带你了解软件工程中的类与类的关系

三、总结

  • 各种关系的强弱顺序:泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖
  • 聚合与组合的区别:

聚合关系是“has-a”关系,组合关系是“contains-a”关系;聚合关系表示整体与部分的关系比较弱,而组合比较强;聚合关系中代表部分事物的对象与代表聚合事物的对象的生存期无关,一旦删除了聚合对象不一定就删除了代表部分事物的对象。组合中一旦删除了组合对象,同时也就删除了代表部分事物的对象。

另外有一个差别是组合中的一个对象在同一时刻只能属于一个组合对象,而聚合的一个部分对象可以被多个整体对象聚合。

  • 在类中的表现:
    • 依赖关系:关系对象出现在局部变量或者方法的参数里,或方法的返回值或者关系类的静态方法被调用
    • 泛化关系:继承父类或抽象类
    • 实现: 实现接口
    • 关联关系:关系对象出现在实例变量中
    • 聚合关系:关系对象出现在实例变量中
    • 组合关系:关系对象出现在实例变量中

       在网上看到这样一个例子,希望可以帮助到你:学生学习需要要文具,这就是依赖;老师与学生,这就是关联。学生与所在班级,这就是是聚合。学生和心脏,这是组合。学生和他爹, 这是就是泛化。学生和美食,给她一个吃饭的接口即可。当然可能有些人认为例子不太恰当,但我感觉这个例子还不错。

ps:若文章中有错误或不恰当的地方,可以再评论区指出,感谢。