zoukankan      html  css  js  c++  java
  • 6、面向对象设计之合成复用原则

      合成/聚合复用原则(Composite/Aggregate Reuse Principle简称CARP),经常又叫做合成复用原则(Composite Reuse Principle 或CRP),就是在新的对象里面使用一些已有的对象,使之成为新对象的一部分:新对象通过向这些对象的委派达到复用已有功能的目的。

      简而言之,尽量使用合成/聚合,尽量不要使用继承。

      区分“Has-A"与”Is-A","Is-A"是严格的分类学上意义上的定义,意思是一个类是另一个类的“一种”。而“Has-A"则不同,他表示某个角色具有某项责任。导致错误的使用继承而不是合成/聚合的一个常见的原因是错误的把“Has-A"当作”Is-A"。

      对象的继承关系是在编译时就定义好了,所以无法在运行时改变从父类继承的实现。子类的实现与他的父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化。当你要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写或被其它更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性

      合成(Composition)和聚合(Aggregate)都是关联的特殊种类。聚合表示一种弱的“拥有”关系,体现了A对象可以包含B对象,但B对象不是A对象的一部分。合成则是一种强的“拥有”关系,体现了部分和整体的关系,部分和整体的生命周期一样。比如:大雁与自己的翅膀是强拥有关系,一只大雁与一群大雁的关系是弱拥有的关系。人与自己的器官,人与人群。银行卡,信用卡与储蓄卡

      盲目使用继承会影响程序的扩展和修改,本质原因是继承是一种强耦合的结构,父类变,子类就变。使用继承时要在“Is-A"关系时再考虑使用,而不是任何时候都去使用。

      合成复用原则又称为合成/聚合复用原则其定义如下:

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

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

      在面向对象的设计中,可以通过两种基本方法在不同的环境中复用已有的设计和实现,即通过组合/聚合关系或通过继承。

      继承复用:实现简单易于扩展,但破环系统的封装性;从基类继承而来的实现是静态的,不可能在运行时发生改变,没有足够的灵活性;只能在有限的环境中使用。(”白箱“复用)

      合成复用:耦合度相对较低,选择性地调用成员对象的操作,可以在运行时动态进行(”黑箱“复用)

      组合/聚合可以使系统更加灵活,类与类之间的耦合度降低,一个类的变化对其他类造成的影响相对较少,因此一般首选使用组合/聚合来实现复用,其次才考虑继承,在使用继承时,需要严格遵循里氏替换原则,有效使用继承会有助于对问题的理解,降低复杂度,而滥用继承反而会增加系统构建和维护的难度,因此需要慎重使用继承复用。

      要避免在系统设计中出现一个类的继承层次超过3层。

  • 相关阅读:
    闯荡Linux帝国:nginx的创业故事
    一个HTTP数据包的奇幻之旅
    远去的传说:安全软件群雄混战史
    默认浏览器争霸传奇
    浏览器主页锁定之战——IE:我太难了
    产品vs程序员:你知道www是怎么来的吗?
    手把手教你从零开始搭建SpringBoot后端项目框架
    使用IntelliJ IDEA新建Java Web后端resfulAPI模板
    如何正确的在项目中接入微信JS-SDK
    html2canvas关于图片不能正常截取
  • 原文地址:https://www.cnblogs.com/sy-liu/p/12966542.html
Copyright © 2011-2022 走看看