原文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

posted on 2014-03-27 13:27  学到老死  阅读(2322)  评论(0编辑  收藏  举报