UML笔记

准确理解设计模式首先要理解UML图,学习看懂UML类图和时序图,理解并记下笔记。

UML笔记

0 链接

看懂UML类图和时序图

本文主要参考该文档,是对该文档的学习、理解笔记。

1 UML笔记

_images/uml_class_struct.jpg
  • 车的类图结构为<>,表示车是一个抽象类;
  • 它有两个继承类:小汽车和自行车;它们之间的关系为实现关系,使用带空心箭头的虚线表示;
  • 小汽车为与SUV之间也是继承关系,它们之间的关系为泛化关系,使用带空心箭头的实线表示;
  • 小汽车与发动机之间是组合关系,使用带实心箭头的实线表示;
  • 学生与班级之间是聚合关系,使用带空心箭头的实线表示;
  • 学生与身份证之间为关联关系,使用一根实线表示;
  • 学生上学需要用到自行车,与自行车是一种依赖关系,使用带箭头的虚线表示;

1.1 泛化与实现

1.1.1 泛化关系(Generalization)

泛化关系是进一步的一般化、具体化。泛化关系是一种is-a的关系。

_images/uml_generalization.jpg

A generalizes B.

A泛化了B。

A is a B.

例如:

  • “SUV”泛化了“小型车”;
  • “山地自行车”泛化了“山地车”;
  • “金丝猴”泛化了“猴子”;
  • “别墅”泛化了“住宅”;
  • “高级工程师”泛化了“工程师”。

编程实现中,泛化关系表现为子类继承父类(子类泛化了父类)。

泛化关系中,泛化的对象本身就是一个实体,所以指向“实体”的线条用实线

1.1.2 实现关系(Realization)

实现关系是把虚的(abstract)实现为实的(concrete)。

_images/uml_realize.jpg

A realizes B.

A实现了B。

例如:

  • “小汽车”实现了“车”;
  • “自行车”实现了“车”;
  • “猴子”实现了“动物”;
  • “住宅”实现了“建筑”;
  • “工程师”实现了“职务”。

编程实现中,泛化关系表现为实现抽象类或实现接口(子类实现了抽象类、接口)。

实现关系中,实现对象为抽象的类或接口,所以指向“虚体”的线条用虚线

1.1.3 辨析

个人理解:泛化是一个具体类对另一个具体类型的泛化,而实现是对一个还不够具体的抽象类型的实现。具体的类本身就可以是一个完整的类型,抽象类型往往是一类事物的顶层抽象类。

1.2 聚合与组合

1.2.1 聚合关系(Aggregation)

聚合关系指的是A聚合形成了B。

_images/uml_aggregation.jpg

B aggregates A.

B聚合了若干A。

或者说,若干A聚合形成了B。

例如:

  • “学生”聚合形成了“班级”;
  • “人”聚合形成了“部门”;
  • “服务器”聚合形成了“集群”。

相较于组合关系,聚合关系是一种弱依赖关系,A聚合形成B,但B消失了,A仍然存在。(部门消失了,但人不会消失,仍然存在)

因为是一种“弱依赖”关系,所以用的菱形是空心的。

1.2.2 组合关系(Composition)

组合关系指的是若干A组合形成了B,或者说,B组合了若干A而成。

_images/uml_composition.jpg

A composes B.

A组合形成了B。

例如:

  • “部门”组成了“公司”;

相较于聚合关系,组合关系是一种强依赖关系,A组合形成了B,且B消失了,A也就消失了。(公司消失了,部门也就没了)

因为是一种“强依赖”关系,所以用的菱形是实心的。

1.2.3 辨析

个人理解:聚合一般是具体的实体聚合形成抽象的概念,组合关系则是抽象的观念符号组合成了一个更高一级的抽象的观念符号。

1.3 关联与依赖

1.3.1 关联关系(Association)

关联关系指的是A与B具有固有的、结构性的关联关系,而非动态变化的。

_images/uml_association.jpg

A associates B.

A关联B。

例如:

  • “公民”和“身份证”是一种关联关系;(“公民”一定有“身份证”,身份证号是公民的一个固有属性)
  • “汽车”和“型号”是一种关联关系;

关联关系默认不强调方向,表示对象间相互知道;如果特别强调方向,如图,表示A知道B,但 B不知道A。

关联关系是固有的、结构性的,不会动态变化,所以关联关系用实线表示。

在编程实现中,关联对象通常是以成员变量的形式实现的。

1.3.2 依赖关系(Dependency)

依赖关系表示A需要用到B,是一种动态的、运行时的依赖关系,不是固有不变的结构性关系。

_images/uml_dependency.jpg

A depends on B.

A依赖于B。

例如:

  • “学生”依赖“笔”;(但“笔”并不是“学生”的一个固有属性,只是需要的时候会用到)

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

依赖关系是动态的、运行时的,在需要的时候才依赖的,不是固有的联系,所以依赖关系用虚线表示。

在编程实现中,依赖关系体现为类构造方法及类方法的传入参数,箭头的指向为调用关系;依赖关系除了临时知道对方外,还是“使用”对方的方法和属性;

1.3.3 辨析

个人理解:关联关系是固有属性,依赖关系是有时会需要的东西,例如:某个方法的传入参数。