一、UML统一建模语言简介
在软件开发流程中,一般应先对软件开发的过程进行建模,把要做什么功能、如何去实现、达到什么样的程度这些基本问题分析清楚了,才去写代码实现。建模是对现实按照一定规则进行简化,但应该体现出现实事物的特点。通过软件建模可以把现实世界中的问题转化到计算机世界进行分析和实现,软件建模的实现过程就是需求-建模-编码的一个过程。
UML统一建模语言,United Modeling Language,是一种面向对象的可视化建模语言,通过图形符号描述现实系统的组成,通过建立图形之间的关系来描述整个系统模型。
二、类图
类图是面向对象系统建模中最常用的一种UML图,主要用来表示类与类之间的关系,包括泛化关系、关联关系、依赖关系和实现关系。
类图由三部分组成:类名、属性和方法。
- 表示private
+ 表示public
# 表示protected
点击选择类组件就可以进行设置,可以直接在组件上修改,也可以在右侧Editors修改。
- 属性表示为 属性名:类型
- 方法表示为 方法名(参数类型):返回值类型
三、类与类之间的关系
1. 泛化关系
Generalization,用来表示类与类之间的继承关系,也叫做is a kind of关系,用三角形的箭头从子类指向父类。
2. 实现关系
Realization,实现关系就是类或接口的实现,由三角箭头虚线从实现类指向接口类,(比如C++中纯虚函数的实现)。可以在右侧查看类之间的关系。
3. 依赖关系
Dependency,依赖关系是指在一个类中要用到另一个类的实例的一种关系,主要表现为一个类是另一个类的函数参数,或者一个类是另一个类的函数返回值的情况。在类图中的表现形式为一个虚线箭头从一个类指向被依赖的类。
具体代码表现形式为
1. class Class4 {}; 2. class Class3 3. { 4. public: 5. void function(Class4 temp) //Class4类对象作为Class3的成员函数的函数参数 6. { 7. /**/ 8. } 9. };
4. 关联关系
Association,关联关系是类和类之间对应的一种连结,是指两个独立的对象,一个对象的实例与另一个对象的一些特定实例存在固定的对应关系。关联关系可以是单向的也可以是双向的,通过关联使得一个类可以使用另一个类的属性和方法,在C++中具体的表现形式为,一个类的对象是另一个类的成员属性。在类图中,单向的是带箭头的实线,双向的是不带箭头的实线。
代码形式为
1. class Class6 {}; 2. class Class5 3. { 4. public: 5. void func() 6. { 7. c.func1(); //可以直接使用Class6的方法 8. } 9. private: 10. Class6 c; //Class6对象作为Class5类的成员属性 11. };
5. 聚合关系
Aggregation,聚合关系表示整体和部分的关系,它是一种has-a的包含关系,而且整体和部分是可以分离的,即离开整体,部分也能存在。聚合关系是关联关系的一种,它是一种更强的关联关系。聚合关系在C++中的表现也是成员变量的方式,但是和关联关系不同的是,关联关系中的两个类是相互独立的,而聚合关系中的两个类是整体与部分的关系,一个类是另一个类的一部分。在类图中,空心菱形在代表整体的类那侧,另一侧为代表部分的类。
聚合关系的简单理解,比如手机和充电线,充电线是手机的一部分,手机就是整体,充电线是部分,但是没有手机了,充电线也可以单独存在。代码表现形式为:
1. class charger {}; 2. class phone 3. { 4. public: 5. void set_charger(charger m_c) 6. { 7. this->m_c = m_c; 8. } 9. public: 10. charger m_c; 11. };
在聚合关系中,我们在创建一个对象phone的时候可以不去管charger,因为在phone类中定义了set_charger方法用于构造charger,我们可以通过该方法在其它时机设置charger。
6. 组合关系
Composite,也是关联关系的一种,是一种比聚合关系更强的关联关系。如果两个类是聚合关系(A是B的一部分),那么离开B之后,A就失去了存在的意义。组合关系是一种不可分离的关系。在类图中用实心菱形指在代表整体的类,另一侧为代表部分的类。
聚合关系的简单理解,屏幕screen是手机phone的一部分,并且屏幕screen离开手机phone之后就失去了存在的意义,这就是组合关系。代码表现形式为:
1. class screen {}; 2. class phone 3. { 4. public: 5. phone(screen m_s) 6. { 7. this->m_s = m_s; 8. } 9. public: 10. screen m_s; 11. };
在组合关系中,创建phone对象的时候就已经构造了属性m_s,也就是整体phone的生命周期也决定了部分screen的生命周期,一旦phone生命周期结束了,screen的生命周期也结束了。在聚合关系中,没有这种强的生命周期的关联。
四、小结
对6种类与类之间的关系进行总结对比:
- 泛化关系和实现关系的区别:泛化关系是指C++中的继承关系;而实现关系是指虚基类的继承,在子类中实现虚基类的纯虚函数。
- 泛化关系和实现关系可以看成依赖关系的一种,因为它们离开依赖的类都无法编译通过。
- 聚合关系和组合关系是关联强度逐渐增强的关联关系;关联关系双方是平等的,聚合关系和组合关系的双方是整体和部分的关系。
- 聚合关系的双方整体和部分可以分离单独存在,没有生命周期的强相关;组合关系双方,部分离开整体将失去意义,整体的生命周期代表了部分的生命周期。