设计模式-合成复用原则

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

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

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

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

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

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

详细示例请参考原文:

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

转载于:https://my.oschina.net/whforever/blog/787002

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值