设计模式-合成复用原则

合成复用原则: 尽可能使用对象组合, 而不是继承来达到复用的目的..net

合成复用原则就是在一个新的对象里经过关联关系(包括组合关系和聚合关系)来使用一些已有的对象, 使之成为新对象的一部分; 新对象经过委派调用已有对象的方法达到复用的目的. 简言之: 复用时要尽可能经过组合/聚合关系(关联关系), 少用继承.设计

在面向对象设计中, 能够经过两种方法在不一样的环境中复用已有的设计和实现, 既*经过组合/聚合关系或者经过继承关系, 但首先应该考虑组合/聚合, *组合/聚合可使系统更加灵活, 下降类与类之间的耦合度, 一个类的变化对其它类形成的影响较少; 其次才考虑继承关系, 在继承时, 要严格遵循里氏代换原则, 有效使用继承会有助于对问题的理解, 下降复杂度, 而滥用继承反而会增长系统构建和维护的难度以及系统的复杂度, 所以要慎重使用继承复合.对象

经过继承来进行复用的主要问题在于继承复用会破坏系统的封装性,由于继承会将基类的实现细节暴露给子类,因为基类的内部细节一般对子类来讲是可见的,因此这种复用又称“白箱”复用,若是基类发生改变,那么子类的实现也不得不发生改变;从基类继承而来的实现是静态的,不可能在运行时发生改变,没有足够的灵活性;并且继承只能在有限的环境中使用(如类没有声明为不能被继承)。blog

因为组合或聚合关系能够将已有的对象(成员对象)归入到新对象中, 使之成为新对象的一部分, 所以新对象能够调用已有对象的功能, 这杨做可使得成员对象内部实现细节对于新对象不可见, 因此这种复用又称为"黑箱"复用, 相对继承关系来讲, 耦合度下降, 成员对象的变化对新对象影响不大, 能够在新对象中根据实际须要有选择的调用成员对象的操做; 合成复合能够在运行时动态进行, 新对象能够动态的引用与成员对象类型相同的其余对象.继承

通常而言, 若是两个类之间是 "Has-A" 的关系应该使用组合/聚合; 若是是 "Is-A" 关系可使用继承. "Is-A" 是严格的分类学意义上的一个定义, 意思是一个类是另外一个类的"一种"; "Has-A" 表示某一个角色具备某一项职责.get

详细示例请参考原文:io

Reference: http://blog.csdn.net/lovelion/article/details/7563441引用

相关文章
相关标签/搜索