类与类之间的关系以及UML类图
1、类与类之间的关系
1.1、定义和分类
- 类具有相同属性、方法和关系的对象的抽象,是对象的集合,展示了对象的结构以及与系统的交互行为。类主要有属性(Attribute) 和
方法(Method) 构成,- 属性代表对象的状态,如果属性被保存到数据库,此称之为“持久化”;
- 方法代表对象的操作行为,
- 类具有继承关系,可以继承于父类,也可以与其他的Class进行交互。在软件系统中,类不是孤立存在的,类与类之间存在各种关系。根据类与类之间的耦合度从弱到强排列:
- 1、依赖关系、
- 2、关联关系、
- 3、聚合关系、
- 4、组合关系、
- 5、泛化关系(继承)
- 6、实现关系(泛化和实现的耦合度相等,它们是最强的)
1.2、依赖关系(Dependency)
UML:由类A指向类B的带箭头虚线表示
1.2.1、定义
- 依赖(Dependency)关系是一种使用关系,它是对象之间耦合度最弱的一种关联方式,这种使用关系是具有偶然性的、临时性的、非常弱的,但是类B的变化会影响到类A。
- 比如某人要开车,需要借用一辆车,此时人与车之间的关系就是依赖。表现在代码层面,为类B作为参数被类A在某个method方法中使用
1.2.2、使用( use a)
- 1、B作为A的成员函数参数
- 2、B作为A的成员函数的局部变量
- 3、A的成员函数调用B的静态方法
1.2.3、实例
class Car {
public :
static void run(){
cout << "car is running" << endl;
}
}
class Driver {
//使用形参方式发生依赖关系
public :
void drive1(Car car){
car.run();
}
//使用局部变量发生依赖关系
void drive2(){
Car car = new Car();
car.run();
}
//使用静态变量发生依赖关系
void drive3(){
Car.run();
}
}
1.3、关联关系(Association)
UML:关联可以是双向的,也可以是单向的。在 UML 类图中,双向的关联可以用带两个箭头或者没有箭头的实线来表示,单向的关联用带一个箭头的实线来表示,箭头从使用类指向被关联的类。也可以在关联线的两端标注角色名,代表两种不同的角色。
1.3.1、定义
- 关联(Association)关系是对象之间的一种引用关系,用于表示一类对象与另一类对象之间的联系,如老师和学生、师傅和徒弟、丈夫和妻子等。
- 关联体现的是两个类之间语义级别的一种强依赖关系,这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。关联可以是单向、双向的。
- 依赖和关联都是说一个类用到了另一个类。其区别在于一个是使用,一个是拥有。
1.3.2、使用
- 被关联类B以类的属性形式出现在关联类A中,
- 关联类A引用了一个类型为被关联类B的全局变量
如上图,student 作为teacher 的成员,如list<student> s
;
1.3.3、实例
class Driver {
public:
//使用成员变量形式实现关联
Car mycar;
void drive(){ //车是我自己的车,我“拥有”这个车
mycar.run();
}
...
//使用方法参数形式实现关联
void drive(Car car){ //车不是我的,我只是个司机,别人给我什么车我就开什么车,我使用这个车。
car.run();
}
}
1.4、聚合关系(Aggregation)
UML:带空心菱形的实线来表示,菱形指向整体
1.4.1、定义
- 聚合(Aggregation)关系是关联关系的一种,是强关联关系,是整体和部分之间的关系,是
has-a
的关系。 - 整体与部分之间是可分离的,它们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。
例如,学校与老师的关系,学校包含老师,但如果学校停办了,老师依然存在。
1.4.2、使用(has-a)
和关联类似,聚合关系也是通过成员对象来实现的.
聚合、组合只能配合语义,结合上下文才能够判断出来,而只给出一段代码让我们判断是关联,聚合,则是无法判断的。
class Driver {
public:
//使用成员变量形式实现聚合关系
Car mycar;
void drive(){
mycar.run();
}
}
//车是一辆私家车,是司机财产的一部分。则相同的代码即表示聚合关系了
1.5、组合关系(Composition)
UML :组合关系用带实心菱形的实线来表示,菱形指向整体
1.5.1、定义
- 组合也是关联关系的一种特例,它体现的是一种
contains-a
的关系,这种关系比聚合更强,也称为强聚合。它同样体现整体与部分间的关系,但此时整体与部分是不可分的。 - 在组合关系中,整体对象可以控制部分对象的生命周期,一旦整体对象不存在,部分对象也将不存在,部分对象不能脱离整体对象而存在。
例如,头和嘴的关系,没有了头,嘴也就不存在了。
1.5.2、使用
同关联关系,关联、组合只能配合语义,结合上下文才能够判断出来,而只给出一段代码让我们判断是关联,还是组合关系,则是无法判断的。
class Driver {
public:
Car mycar;
Driver(Car car){
mycar = car;
}
}
//车是司机的必须有的财产,要想成为一个司机必须要先有辆车,车要是没了,司机也不想活了。而且司机要是不干司机了,这个车就砸了,别人谁也别想用。那就表示组合关系了。
1.6、泛化关系(Generalization)
UML :泛化关系用带空心三角箭头的实线来表示,箭头从子类指向父类
1.6.1、定义
泛化(Generalization)关系是对象之间耦合度最大的一种关系,表示一般与特殊的关系,是父类与子类之间的关系,是一种继承关系,是 is-a
的关系。
例如Student 类和 Teacher 类都是 Person 类的子类
1.6.2、使用(is-a)
面向对象的继承机制来实现泛化关系
1.7、实现关系(Realization)
UML:实现关系使用带空心三角箭头的虚线来表示
1.7.1、定义
实现(Realization)关系是接口与实现类之间的关系。在这种关系中,类实现了接口,类中的操作实现了接口中所声明的所有的抽象操作。
参考
1、https://www.cnblogs.com/liuling/archive/2013/05/03/classrelation.html
2、https://blog.csdn.net/qq_36421955/article/details/80824092
3、http://c.biancheng.net/view/1319.html
4、https://blog.csdn.net/u014571489/article/details/81211472
5、https://www.cnblogs.com/lsgxeva/p/7773190.html