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 {  
    publicstatic 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

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐