依赖关系
- 可以简单的理解,类A依赖于类B就是类A使用到了类B,类B的变化会影响到类A
- 这种关系一般是偶然性的、临时性的、非常弱的依赖关系总是单向的
- 表现在代码层面,类B作为参数或局部变量被类A在某个方法中使用,此时类A依赖于类B
UML表示:
类A依赖于类B,用由类A指向类B的带箭头虚线表示
例子:
class Driver { public: dirve(Car car) { car.move(); } ...... }; class Car { public: void move() { ...... } }
关联关系
- 关联是类与类之间的一种强依赖关系
- 这种关系一般具有长期性 关联可以是单向、双向的
- 关联可分为一对一关联、一对多关联、多对多关联
- 表现在代码层面:
- 被关联类B以类的属性形式出现在关联类A中
- 关联类A引用了一个类型为被关联B的全局变量
UML表示
- 用带箭头实线表示,箭头指向被关联类
- 若是双向关联,实线两端可不带箭头
例子:
双向关联:
class Customer { private: Product[] products; ...... }; class Product { private: Customer customer; ...... };
单向关联:
class Customer { private: Address address; ...... }; class Address { ...... };
聚合关系
- 关联关系的一种特例
- 体现的是整体与部分的关系,即has-a的关系,整体与部分之间可分离,具有各自的生命周期
- 比如计算机与CPU、公司与员工、班级和学生
- 表现在代码层面,和关联关系是一致的,只能从语义级别来区分
UML表示
以空心菱形加实线箭头表示
class Car { private: Engine engine; public: Car(Engine engine) { this->engine = engine; } void setEngine(Engine engine) { this->engine = engine; } ...... }; class Engine { ...... };
组合关系
- 也是关联关系的一种特例,体现的是一种contains-a的关系,比聚合更强,也称为强聚合
- 体现整体与部分间的关系,但整体与部分具有相同生命周期,一旦整体对象不存在,部分对象也将不存在
- 比如人和人的四肢
- 表现在代码层面,和关联关系是一致的,只能从语义级别来区分
UML表示
以实心菱形加实线箭头表示
class Head { private: Mouth *mouth; public: Head() { mouth = new Mouth(); } ...... }; class Mouth { ...... };