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

在刚开始接触这三个个概念的时候,我也曾经非常的困惑,现在将自己的总结写给大家看看!希望对大家有所帮助!在大的层面来说,可以吧组合聚合看成一类而与依赖区别开!我先说说组合,聚合:这两个概念都是用来说明两个类之间的一种“包含概念”,可以把一方看成另一方的属性,两个类之间一定存在着某种逻辑上了联系,先说聚合吧,举个例子会好一些:有两个类,一个是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类的方法来实现的!

相关文章

适配器模式将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类可以相互合作。
策略模式定义了一系列算法族,并封装在类中,它们之间可以互相替换,此模式让算法的变化独立于使用算法...
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,它是针对软件开发中经常遇到的一些设计问题...
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以在不改变算法结...
迭代器模式提供了一种方法,用于遍历集合对象中的元素,而又不暴露其内部的细节。
外观模式又叫门面模式,它提供了一个统一的(高层)接口,用来访问子系统中的一群接口,使得子系统更容...