UML 类图

面向对象设计主要就是使用 UML 的类图 ,类图用于描述系统中所包含的类以及它们之间的相互关系,帮助人们简化对系统的理解,它是系统分析和设计阶段的重要产物 ,也是系统编码和测试的重要模型依据

(class /struct)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性、操作、关系的对象集合的总称。在系统中,每个类都具有一定的职责,职责指的是类要完成什么样子的功能,要承担什么样子的义务。一个类可以有多种职责,但是设计得好的类一般只有一种职责

比如,现在定义了猎人类

cpp 复制代码
class Hunter
{
public:
    int m_age = 32;
    static int m_times;
    string getName()
    {
        return m_name;
    }

    void setName(string name)
    {
        m_name = name;
    }

    void goHunting()
    {
        aiming();
        shoot();
    }
    static void saySorry()
    {
        string count = to_string(m_times);
        cout << "Say sorry to every animal " + count + " times!" << endl;
    }

protected:
    string m_name = "Jack";
    void aiming()
    {
        cout << "使用" + m_gunName + "瞄准猎物..." << endl;
    }

private:
    string m_gunName = "AK-47";
    void shoot()
    {
        cout << "使用" + m_gunName + "射击猎物..." << endl;
    }
};
int Hunter::m_times = 3;

以上类的 UML 画法

可以看到该图分为上中下三部分:上层是类名中间层是属性 (类的成员变量),下层是方法(类的成员函数)。

可见性:+ 表示 public# 表示 protected- 表示 private__ (下划线) 表示 static

属性的表示方式:【可见性】【属性名称】:【类型】= {缺省值,可选}

方法的表示方式:【可见性】【方法名称】(【参数名:参数类型,......】):【返回值类型】

如果我们定义的类是一个抽象类 (类中有纯虚函数),在画 UML 类图的时候,类名需要使用斜体显示。

注意\] 在使用 UML 画类图的时候,虚函数的表示方跟随类名,也就是使用斜体,如果是纯虚函数则需要在最后给函数指定 =0。 ### 类与类之间的关系 #### **1.1继承关系** 继承也叫作**泛化** (Generalization),用于描述**父子类之间的关系** ,父类又称为基类或者超类,子类又称作派生类。在 UML 中,泛化关系用**带空心三角形的实线来表示**。 关于继承关系一共有两种:普通继承关系和抽象继承关系,但是不论哪一种表示继承关系的线的样式是不变的。 #### **1.2关联关系** 关联(Assocition)关系是类与类之间最常见的一种关系,它是**一种结构化的关系,表示一个对象与另一个对象之间有联系** ,如汽车和轮胎、师傅和徒弟、班级和学生等。在 UML 类图中,**用(带箭头或不带箭头的)实线连接有关联关系的类。**在 C++ 中这种关联关系在类中是这样体现的,通常将一个类的对象作为另一个类的成员变量。类之间的关联关系有三种,分别是:单向关联、双向关联、自关联。 ##### (1)**单向关联关系** 单向关联指的是关联只有一个方向,比如每个孩子(Child)都拥有一个父亲(Parent) ##### (2) **双向关联关系** 现实生活中每个孩子都有父母,每个父母同样有自己的孩子,如果想要通过类来描述这样的亲情关系 ##### **(3)自关联关系** 自关联指的就是当前类中包含一个自身类型的对象成员,这在链表中非常常见,单向链表中都会有一个指向自身节点类型的后继指针成员,而双向链表中会包含一个指向自身节点类型的前驱指针和一个指向自身节点类型的后继指针。 #### **1.3聚合关系** 聚合(Aggregation)关系表示**整体与部分的关系** 。在聚合关系中,**成员对象是整体的一部分,但是成员对象可以脱离整体对象独立存在** 。在 UML 中,聚合关系用**带空心菱形的直线表示**。 #### 1.4**组合关系** 组合(Composition)关系也表示的是一种**整体和部分的关系** ,但是在组合关系中**整体对象可以控制成员对象的生命周期** ,一旦整体对象不存在,成员对象也不存在,整体对象和成员对象之间**具有同生共死的关系** 。在 UML 中组合关系**用带实心菱形的直线表示**。 #### **1.5依赖关系** 依赖(Dependency)关系是一种**使用关系,特定事物的改变有可能会影响到使用该事物的其他事物** ,在需要表示一个事物使用另一个事物时使用依赖关系,大多数情况下依赖关系体现在某个类的方法使用另一个类的对象作为参数。在 UML 中,依赖关系**用带箭头的虚线表示**,由依赖的一方指向被依赖的一方。 依赖关系通常通过**三种方式**来实现: 将一个类的对象作为另一个类中方法的参数 在一个类的方法中将另一个类的对象作为其对象的局部变量 在一个类的方法中调用另一个类的静态方法 **类之间的关系强弱顺序**是这样的:继承(泛化) \> 组合 \> 聚合 \> 关联 \> 依赖。 关联关系、聚合关系、组合关系之间的**区别** 1. 关联和聚合的区别主要在于语义上:关联的两个对象之间一般是平等的,聚合则一般是不平等的。 2. 聚合和组合的区别则在语义和实现上都有差别:组合的两个对象之间生命周期有很大的关联,被组合的对象在组合对象创建的同时或者创建之后创建在组合对象销毁之前销毁,聚合则无需考虑这些事情。一般来说被组合对象不能脱离组合对象独立存在,而且也只能属于一个组合对象,聚合则不一样,被聚合的对象可以属于多个聚合对象。 最后,再**举例子**来描述一下这三种关系: 朋友之间属于关联关系,因为这种关系是平等的,关联关系只是用于表示两个对象之间的一种简单的联系而已。 图书馆看书的时候,人和书属于聚合关系。书是可以独立存在的,而且书不仅可以属于自己,也可以属于别人。 人和自己的心脏属于组合关系,因为心脏不能脱离人体而独自存在。 不过,实际应用中,这三**种关系的界限划分其实没有那么清楚** ,有些时候我们会感觉组合和聚合没什么区别,所以,在设计的时候没**必要死抠细节** ,只要能够利用对象之间的关系**设计出可行的解决方案即可**。

相关推荐
jianfeng_zhu8 分钟前
整数数组匹配
数据结构·c++·算法
Chrikk8 分钟前
现代化 C++ 工程构建:CMake 与包管理器的依赖治理
开发语言·c++
ozyzo14 分钟前
例题
c++
d111111111d23 分钟前
STM32外设基地址与寄存器偏移地址的深度解析
笔记·stm32·单片机·嵌入式硬件·学习
好奇龙猫30 分钟前
【AI学习-comfyUI学习-第十九节-comtrolnet艺术线处理器工作流-各个部分学习】
人工智能·学习
YangYang9YangYan43 分钟前
2026高职会计电算化专业高价值技能证书
大数据·学习·区块链
世转神风-1 小时前
qt-kits-警告:No C++ compiler,无法正常解析工程项目.pro文件
开发语言·c++
老王熬夜敲代码1 小时前
解决IP不够用的问题
linux·网络·笔记
王老师青少年编程1 小时前
csp信奥赛C++标准模板库STL(12):C++ STL 中的 next_permutation详解
c++·stl·排列·标准模板库·csp·信奥赛·permutation
polarislove02141 小时前
8.1 时钟树-嵌入式铁头山羊STM32笔记
笔记·stm32·嵌入式硬件