原文url:http://www.cnblogs.com/zyj469470971/p/3172471.html
@说到这里要讲提及到“Has-A” 和“Is-A”的区别:
Has-A:表示某一个角色具有某一项责任(表示一个类拥有某个类或者多个类),代表合成。例如大雁和翅膀,是一种强的拥有关系。
Is-A:表示一个类是另一个类的一种(同类型),代表继承。
Is-A,Has-A,Use-A则是用来描述类与类之间关系的。简单的说Is-A代表继承,Has-A代表合成,Use-A代表依赖--关联,强耦合。
@重点:优先使用合成/聚合的好处是,有助于你保持每个类的封装,并被集中在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。
---用组合+继承的关系代替纯继承关系。
---不要使用继承组建功能,而是使用黑箱复用(即对象组合),因为继承的层次增多,造成最直接的后果就是当你调用这个类群中的一个类时,就必须要把他们全部加载到栈中!(后果可想而知。)
1,例如下边两个图中,我都用继承来扩展组建手机功能。
---按手机品牌作为父类来实现继承:
---一部品牌手机,需要n多个子类来组成。手机品牌现在有n多种,继承下来都累死人了,更别提下边功能软件类的继承了(现在手机功能多的更是不可想象)。
---手机软件现在有n多种,手机品牌有n多种,继承下来,也累死人。
备注:而且上面的继承是一种强耦合的结构,父类变,子类就必须要变。
2,用聚合来组建手机,将手机软件和手机品牌分离,各自继承自己的品牌和软件,然后不同品牌具有不同的软件功能,然后聚合在一起行了。
---手机品牌包含手机软件,但软件并不是品牌的一部分,所以他们之间是聚合关系。
---看上边的聚合线,是不是像一座桥,其中包含了一种设计模式,桥接模式!!!http://www.cnblogs.com/feichengwulai/articles/3749749.html
@下边是合成/聚合详细介绍:
看看这一个原则听好理解的哈,因为我也经常在做功能提取,比如提取一些公共的算法什么的。最后达到复用的目的,从而避免了复制代码。
可这里所说的意思好像要在我这个之上,这里的意思是针对一个个的对象,我们可以把某一个业务元素当作是一个个的对象,假如又有一个对象里面具备了其他对象,那么就可以通过聚合的形式进行耦合。在设计模式中尽量使用聚合关系不要使用继承。
举个例子还是会有助于理解哈:比如一个人可以是学生也可以是经理而“学生”和“经理”都可以成为某公司的 “雇员”,这里就可以来理解一下Has-A和Is-A了,学生和经理都是人的一种,那么他们与人的关系就是 Is-A的关系(继承),学生类继承人类,经理类也继承人类,而雇员是人的一个属性(Person类中的一个属性,学生可以是雇员,经理也可以是雇员,工人也可以是雇员,门卫也可以是雇员),所以雇员与人之间是Has-A 的关系(合成),如果聚合复用原则来设计的话关系图如下:(终于可以看到图了 是不是很开心?)
合成---则是一种强的“拥有”关系,体现了严格的部分和整体的关系(是整体与部分的关系,部分不能离开整体而单独存在),部分和整体的生命周期一样。例如,翅膀和大雁。
聚合---表示一种弱的“拥有”关系,A对象可以包含B对象,但B对象不是A对象的一部分。例如大雁和雁群。即不是Has-A,也不是Is-A的关系(继承)。所以,耦合度非常非常小,所以聚合对象中整体和部分都可以单独存在。
@总结:
1,程序就是类的两种应用,一种是类的继承,一种是类的组合,也就是控件的组合,因为控件就是一些类。
2,继承和组合的优缺点对比,看这篇文章:http://www.cnblogs.com/feichengwulai/articles/4137395.html