类的水平关系--依赖,组合,聚合(原创)

来源:互联网 发布:工作进度计划软件 编辑:程序博客网 时间:2024/06/06 18:08

在刚开始接触这三个个概念的时候,我也曾经非常的困惑,现在将自己的总结写给大家看看!
希望对大家有所帮助!

在大的层面来说,可以吧组合聚合看成一类而与依赖区别开!

我先说说组合,聚合:
这两个概念都是用来说明两个类之间的一种“包含概念”,可以把一方看成另一方的属性,两个类之间一定存在着某种逻辑上了联系,

先说聚合吧,举个例子会好一些:
有两个类,一个是PoliceStation类还有一个是Police类(其他无关属性和方法一律忽略)
class PoliceStation
{
...
};

class Police
{
...
private:
    PoliceStation* ps;
};
可以看到Police类中包含了一个PoliceStation类的对象指针,而且在创建一个Police类对象时一定要对指针进行初始化,就好像当你成为警察时一定会属于一个警察局(除非你是假警察!)这个时候,我们可以说Police的每一个对象都有一个PoliceStation属性来标识它是属于哪个警察局的!
但是两者之间并不存在“同生共死”的关系,也就是说当这个警察不存在的时候,警察局早就有了,当警察牺牲了,警察局也不会消失!

下面说说组合:
比如我们有一个Person类和一个Mind(思想)类(可能这个例子不太恰当)
class Mind
{
...
};

class Person
{
...
private:
Mind m;
};
和理解聚合差不多,从人一下生开始就会有思想(想什么我就不管了,别和我说婴儿,那太死心眼了)当人一旦死亡的时候,思想也会随之停止了,
这就是与聚合的不同之处!

最后我来说说,与前两者有较大区别的依赖:
以老鼠吃苹果来做例子(别问我老鼠吃不吃苹果,我会败给你的)。
言归正传,
有个老鼠类Mouse还有一个Apple类;
在具体写类的时候,你不能把Apple和Mouse形成聚合或者组合的关系,因为并不能把Apple看成是Mouse的一种属性,不存在"包含关系"!
试想一下,哪只老鼠在一生出来就有一个指定好的要吃的苹果呢!

其实这种老鼠吃苹果的事件有一定的偶然性!
那该怎么设计呢:
class Apple
{
...
};

class Mouse
{
...
void Eat(Apple* a){...}
...
};

通过一个方法,并让Apple类指针做形参(引用也可以),这样子就实现了老鼠吃苹果的过程,也许会有人问,为什么要用指针类型做形参?

因为老鼠吃苹果并不只会影响老鼠自己,对苹果也会引起一些变化(也可能引起其他类的变化,比如苹果里的小青虫),而这些变化都是通过传递过来的指针来间接调用Apple类的方法来实现的!

原创粉丝点击