一.组合关系
组合是一个类中包含另一个类对象。相比聚合, 组合是一种强所属关系,组合关系的两个对象往往具有相同的生命周期,被组合的对象是在组合对象创建的同时或者创建之后创建,在组合对象销毁之前销毁。一般来说被组合对象不能脱离组合对象独立存在,整体不存在,部分一定不存在。举例:人与手、人与头之间的关系,人需要包含头和 手,头、手是人的一部分且不能脱离人独立而存在。
main中人创建CPeople peo;手也同时创建出来CHand m_hand;
人是组合对象 手是被组合对象
#include<iostream>
using namespace std;
class CHand {
public:
void move() {
cout << "手在移动" << endl;
}
};
class CPeople {
public:
CHand m_hand;
public:
void clap() {
m_hand.move();
cout << "拍手。。" << endl;
}
};
int main() {
CPeople peo;
peo.clap();
return 0;
}
继承与组合对比
组合可以被说成“我请了个老头在我家里干活” ,继承则是“我父亲在家里帮我干活"
二.依赖
它是一种 "uses a" 的关系。一个对象的某种行为依赖于另一个类对象,被依赖的对象视为完成某个功能的工具,并不持有对他的引用,只有在完成某个功能的时候才会用到,而且是必不可少的。依赖之间是没有生命周期约束关系的。举例:人要完成编程这件事,那么需要用到电脑,电脑作为一 个工具,其他的时候不需要,电脑也不可能作为人的属性而存在(非组合关系),人必须依赖于电脑才能完成编程这件事。
C++语法中,代码的表现形式为多种,通常将被依赖的对象作为另一类方法的参数的形式实现两个
类之间的依赖关系。
举例中人必须依赖电脑来完成编程这个工作
#include<iostream>
using namespace std;
class CComputer {
public:
void complie() {
cout << "电脑正在编译代码......" << endl;
}
};
class CPeople {
public:
void code(CComputer* pCom) {
if (pCom) {
pCom->complie();
}
else {
cout << "我怕无法完成敲代码的功能" << endl;
}
}
};
int main() {
CComputer* pCom = new CComputer;
CPeople peo;
peo.code(pCom);
return 0;
}
三.关联
它是一种"has a"的关系。关联不是从属关系,而是平等关系,可以拥有对方,但不可占有对方。
完成某个功能与被关联的对象有关,但被关联的对象可有可无。被关联的对象与关联的对象无生命
周期约束关系,被关联对象的生命周期由谁创建就由谁来维护。只要二者同意,可以随时解除关系
或是进行关联,被关联的对象还可以再被别的对象关联,所以关联是可以共享的。
举例:人和朋友 的关系,人要完成玩游戏这个功能,没有朋友可以自己玩游戏,如果交到朋友了就可以和朋友一起玩游戏。
C++语法中,通常在关联的类中定义被关联类对象的指针形式实现两个类之间的关联关系。
强调的是可有可无的平等关系 有无m_pri指针都可以调用playWangzhe()函数
CFriend* m_pri;
CPeople() {
m_pri = nullptr;
}
CPeople() {
m_pri = nullptr;
}
人出生就会有朋友这个属性,但是这个属性为空
#include<iostream>
using namespace std;
class CFriend {
public:
void play() {
cout << "我和我的朋友正在玩耍..." << endl;
}
};
class CPeople {
public:
CFriend* m_pri;
CPeople() {
m_pri = nullptr;
}
public:
void playWangzhe() {
if (m_pri) { //有朋友
cout << "找朋友组队。。。" << endl;
m_pri->play();
}
else { //没朋友
cout << "没有朋友 自己组队" << endl;
}
}
};
int main() {
CPeople peo;
peo.playWangzhe();
CFriend* m_pFri = new CFriend;
peo.m_pri = m_pFri; //交到朋友
peo.playWangzhe();
return 0;
}
四.聚合
它是一种"owns a"的关系。多个被聚合的对象聚集起来形成一个大的整体,聚合的目的是为了统一
进行管理同类型的对象,聚合是一种弱所属关系,被聚合的对象还可以再被别的对象关联,所以被
聚合对象是可以共享的。虽然是共享的,聚合代表的是一种更亲密的关系,相当于强版本的关联。
C++语法中,通常在聚合类中定义被聚合对象指针的容器。
class CPeople{};
class CFamily{
CPeople* families[10];
};