在一个系统中,一个对象可能与不同的对象相关,以下是不同的关系
- 依赖(Dependency)使用一个
- 关联(Association)使用一个
- 聚合(Aggregation)有一个
- 组合(Composition)有一个,“用…来实现”
- 继承(Inheritance)是一个
- 类模板(Class template)
依赖
依赖(Dependency):使用一个
class Book{};
class Food{};
class Human
{
public:
void Read(Book book);
void Eat(Food food);
};
通过方法与外部实体产生关系,依赖关系两个独立的对象之间非常轻微的关系
不存在包含于被包含到关系,通过方法与外部类型产生关联
class Notebook_computer
{};
class deattop_computer
{
private:
string cup;
int Memory;
int ssdist;
};
程序类之间的“依赖”关系主要体现出的是一种使用关系,对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者当一个对象依赖于另一个对象所提供的服务时,这两个对象之间主要体现为依赖关系
在类型的实际中,依赖关系主要体现在目标类型的对象(实例),作为当前类型方法的局部对象或者方法的参数类型
关联
关联(Association):使用一个
对于两个相互独立的对象,当对象A与另一个对象B存在固定的对应关系时,这两个对象之间为关联关系,关联关系是依赖关系的特例
在类型的设计中,关联关系主要体现在目标类型的指针或引用,作为当前类型的属性成员,没有整体和部分的关系,只是有关系而已
- 弱关联
class Book{};
class Person
{
private:
Book* ptr; //弱关联
public:
Person() :ptr(nullptr) {}
Person(Book* p) :ptr(p) {}
~Person() {}
void SetBook(Book* p) { ptr = p; }
void Study()
{
if (ptr != nullptr)
{
cout << "read" << endl;
}
else
{
cout << "play" << endl;
}
}
};
int main()
{
Book book;
Person son;
son.SetBook(&book);
}
我们所关联的对象并不在我们的生存期中
- 强关联
class Student
{
private:
Book& _book; //必须初始化
public:
Student(Book &book):_book(book){}
};
int main()
{
Book book;
Student stu(book);
}
构建stu的时候,必须由book进行初始化,形成强关联
聚合
class Point
{
private:
float _x;
float _y;
public:
Point() :_x(0.0), _y(0.0) {}
};
class circle
{
private:
Point _center; //圆心
float _radius; //半径
};
class circle
{
private:
Point* pCenter;
float _radius;
}
圆对象进行析构,不代表一定要将点对象也进行析构,其为聚合关系
组合
class Soul {};
class Body {};
class People
{
Soul _soul;
Body _body;
public:
People(Soul soul,Body body):_soul(soul),_body(body)
{}
};
当People对象析构,则Soul与Body对象也必须进行析构