一文搞懂 UML 类图
面向对象设计 主要就是使用UML的类图,类图用于描述系统中所包含的类以及它们之间的相互关系,帮助人们简化对系统的理解,它是系统分析和设计阶段的重要产物,也是系统编码和测试的重要模型依据
一、UML类图简介
统一建模语言 UML (Unified Modeling Language) 类图是一种用于描述系统结构的图形化工具。它以类和对象为基础,主要用于表示系统中的类、接口、继承关系、关联关系等元素,以及它们之间的静态结构和关系。在本文中,将深入介绍UML类图的基本元素、关系类型以及如何创建一个简单而有效的类图。
类图以反映类的结构(属性、操作)以及类之间的关系为主要目的,描述了软件系统的结构,是一种静态建模方法。类图用来描述系统中有意义的概念,包括具体的概念、抽象的概念、实现方面的概念等,是对现实世界中事物的抽象。
类图的主要作用是对系统的词汇进行建模、对简单的协作进行建模和对逻辑数据库模式进行建模。类图显示集合的类,接口,关联,协作和约束,它也被称为作为结构图。
UML类图是在 设计程序之前 画,而不是等写完程序再画!!!
类(
Class
)、接口(Interface
)以及类之间的关系
二、类与类之间的关系
UML中的关系是面向对象关系。如果不以面向对象的思维去考虑会感觉到有很多关系认为是一样的
关系 | 说明 | 表示 |
继承(泛化) | 继承关系,指向方(符号左)子类,被指向方(符号右)为父类 | ![]() |
实现 | 接口的实现关系,指向方(符号左)实现类,被指向方(符号右)为接口类。 | ![]() |
组合 | 整体和部分关系,指向方(符号左)整体类,被指向方(符号右)为部分类 | ![]() |
聚合 | 整体和部分关系,指向方(符号左)整体类,被指向方(符号右)为部分类 | ![]() |
关联 | 是类与类之间的联结,将一个类的对象(被指向方)作为另一个类(指向方)的属性。 | ![]() |
依赖 | 使用关系,指向方(符号左)使用类,被指向方(符号右)为被使用类 | ![]() |
2.1 继承
继承 也叫作 泛化(Generalization
),用于描述父子类之间的关系,父类又称为 基类 或者 超类,子类又称作 派生类。在UML中,泛化关系用 带空心三角形的实线 来表示
2.2 组合
组合(Composition
)关系也表示的是一种整体和部分的关系,但是在组合关系中 整体对象 可以 控制 成员对象的生命周期,一旦整体对象不存在,成员对象也不存在,整体对象和成员对象之间具有 同生共死 的关系。
在UML中组合关系用带 实心菱形的直线 表示,下面举两个组合关系的例子:
- 头(
Head
)和 嘴巴(Mouth
)、鼻子(Nose
)、耳朵(Ear
)、眼睛(Eye
) - 树(
Tree
)和 树根(Root
)、树干(Trunk
)、树枝(Branch
)、树叶(Leaf
)
class Engine {public void start() {System.out.println("Engine starting.");}public void stop() {System.out.println("Engine stopping.");}
}class Car {private Engine engine = new Engine();public Car() {// 初始化代码,例如 engine.start()}public void startEngine() {engine.start();}public void stopEngine() {engine.stop();}
}public class CompositionExample {public static void main(String[] args) {Car myCar = new Car();myCar.startEngine();myCar.stopEngine();}
}
2.3 聚合
聚合(Aggregation)关系表示 整体 与 部分 的关系。在聚合关系中,成员对象 是 整体的一部分,但是成员对象可以脱离整体对象独立存在。在UML中,聚合关系用 带空心菱形的直线 表示,下面举两个聚合关系的例子:
汽车(Car)与 引擎(Engine)、轮胎(Wheel)、车灯(Light)
森林(Forest)与 植物(Plant)、动物(Animal)、水(Water)、阳光(Sunshine)
public class Engine {private String model;public Engine(String model) {this.model = model;}// Getter and Setter methodspublic String getModel() {return model;}public void setModel(String model) {this.model = model;}
}public class Car {private Engine engine;public Car(Engine engine) {this.engine = engine;}// Getter and Setter methodspublic Engine getEngine() {return engine;}public void setEngine(Engine engine) {this.engine = engine;}
}public class Main {public static void main(String[] args) {Engine engine = new Engine("V8");Car car = new Car(engine);// 显示汽车的发动机型号System.out.println("Car is using " + car.getEngine().getModel() + " engine.");}
}
2.4 关联关系
关联(Assocition)关系是类与类之间最常见的一种关系,它是一种结构化的关系,表示一个对象与另一个对象之间有联系,如汽车和轮胎、师傅和徒弟、班级和学生等。在UML类图中,用 ( 带接头 或 不带箭头 的)实线 连接有关联关系的类。通常 将一个类的对象 作为 另一个类的成员变量。类之间的关联关系有三种,分别是:单向关联、双向关联、自关联。下面逐一给大家进行介绍
(a) 单向关联
单向关联指的是关联只有一个方向,比如每个孩子(Child
)都拥有一个父亲(Parent
),其代码实现为
class Parent{};class Child{
private Parent m_father;
}
(b) 双向关联
现实生活中每个孩子都有父母,每个父母同样有自己的孩子,如果想要通过类来描述这样的亲情关系
class Parent {
private Child m_son;
};class Child {
private Parent m_father;
};
或者
(c)自关联
自关联指的就是当前类中 包含一个自身类型的对象成员,这在 链表 中非常常见,单向链表中都会有一个指向自身节点类型的后继指针成员,而双向链表中会包含一个指向自身节点类型的前驱指针和一个指向自身节点类型的后继指针。就以双向链表节点类为例
class Node {
private int m_data = 0;
private Node m_prev;
private Node m_next;
};
一般使用 带箭头的实线 来描述自关联关系,我中有我,独角戏。
2.5 依赖关系
依赖(Dependency)关系是一种 使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系,大多数情况下依赖关系体现在某个类的方法 使用 另一个类的对象 作为参数。在UML中,依赖关系用 带箭头的虚线 表示,由 依赖 的一方 指向 被依赖的一方,下面举两个依赖关系的例子:
驾驶员(Driver)开车,需要将车(Car)对象作为参数传递给 Driver 类 的 drive()方法
class Car {
public void move() {}
}; class Driver {
public void drive(Car car) { car.move();
}
};
依赖关系通常通过三种方式来实现:
将一个类的对象 作为 另一个类中方法的参数
在一个类的方法中将另一个类的 对象 作为 其对象的 局部变量
在一个类的方法中 调用 另一个类的 静态方法类之间的关系强弱顺序是这样的:继承(泛化) > 组合 > 聚合 > 关联 > 依赖。
三、组合、聚合、关联关系之间的区别
组合 和 聚合 的区别则在 语义 和 实现 上都有差别:
组合的两个对象之间生命周期有很大的关联,被组合的对象 在 组合对象创建的 同时或者创建之后 创建,在组合对象销毁之前销毁,聚合则无需考虑这些事情。
一般来说 被组合对象 不能脱离 组合对象独立存在,而且也只能属于 一个 组合对象,聚合则不一样,被聚合的对象可以属于 多个 聚合对象。
关联 和 聚合 的区别主要在于 语义 上:关联的两个对象之间一般是平等的,聚合则一般是不平等的。
(实际应用中,这三种关系的界限划分其实没有那么清楚,有些时候我们会感觉组合和聚合没什么区别,所以,在设计的时候没必要死抠细节,只要能够利用对象之间的关系设计出可行的解决方案即可。 如果同时有多个关系,只需画出最强的关系即可。)
最后,再举例子来描述一下这三种关系:
人和自己的心脏属于组合关系,因为心脏不能脱离人体而独自存在。
图书馆看书的时候,人和书属于聚合关系。书是可以独立存在的,而且书不仅可以属于自己,也可以属于别人。朋友之间属于关联关系,因为这种关系是平等的,关联关系只是用于表示两个对象之间的一种简单的联系而已。
原文链接:https://blog.csdn.net/weixin_43412762/article/details/134677819