融会贯通——最常用的“合成复用原则”技能点Get

复用一个类的时候,多使用对象的组合/聚合的关联关系,而不是继承。

之前提到的“依赖倒转原则”,是以里氏代换原则为基础的实现开闭原则目标的手段,这一条路线涉及到的是类的继承(包括单继承和接口实现),他们支撑了Java多态的特性。

但是今天要谈一谈Java另一个特性——封装。封装就是不要暴露过多的基类内部细节给子类,让高层的操作神秘起来,不让小兵知道。合成复用原则体现的就是封装的特性。

所以可以推论出,多使用对象的组合/聚合关系,而不是继承,从而实现不会暴露过多的基类操作细节给子类的目的。

那么组合和聚合是什么?他们和继承有什么区别?他们各自之间又有什么区别呢?

先说结论,相对于组合和聚合之间的区别,他们和继承之间的区别更大。

  • 组合和聚合都是在一个对象(相当于子类)中把另一个类(相当于基类)的对象当做其成员对象,这和继承比起来,关系要弱化很多,降低了耦合度,“子类”并不需要明显的继承和实现的关键字出现,它并不值得作为成员对象的“基类”的对象内部都实现了些什么,它的成员变量又是什么,即使“基类”的内部进行了修改,代码重构,对于“子类”来说并不需要做任何改动。
  • 组合和聚合的区别可以从语言学上来讲:组合是很多部分组成了一个东西,聚合是很多东西聚在一起。这样就十分清晰了,好比一个狼类,它肯定有脚类对象,头类对象,爪子类对象等作为其成员对象,这就是组合关系。那么狼群类,它肯定是有狼类作为其成员对象,而不会有狼自身的什么脚类对象、头类对象等,这就是聚合。要根据这些原则去设计程序,而不是模式,特性用得越多越好,用得不恰当反而会增加系统的复杂度,降低系统可维护性。这些模式,继承,封装等等就像是工具箱里面的十字花螺丝刀,一字螺丝刀,剪刀等,在干活的时候,要根据活的情况去选择螺丝刀还是剪刀,还是都要用。而不是一味地使用十字花螺丝刀,干遍天下的活。没有万能工具,因为我们还有“单一指责原则”,“接口隔离原则”,要去拆分功能,让每个工具功能单一化,也就是追求深度(可以把十字花螺丝刀那个头做的结实点),不追求广度(而不是既能当螺丝刀又能当剪刀)。有朋友提出,那瑞士军刀呢,它可谓是多功能的?瑞士军刀的多功能性更像是一个小型工具箱,不要把它当做是一个单一的工具,瑞士军刀类里面有很多聚合来的螺丝刀类的对象,小剪刀类的对象,所以,瑞士军刀其实也是“单一职责原则”,“合成复用原则”的体现,他就是将各种模式,特性运用的非常得体的一个好产品。

那么具体什么“活”的时候要用继承,什么“活”的时候用组合/聚合的关联关系呢?

请记住:继承一定是描述“Is-A”(它是它)的类之间的关系,而组合/聚合的关联关系一定是描述“Has-A”(它包含它)的类之间的关系。

时间: 2024-10-09 23:15:00

融会贯通——最常用的“合成复用原则”技能点Get的相关文章

小菜学设计模式——合成复用原则

背景 本文标题为什么叫小菜学习设计模式,原因是本文内容主要是学习<大话设计模式>时的笔记摘要部分,当然,并不是记录书中小菜的学习过程,这个完全没有意义,而是指本人学习设计模式的成长之旅. 真诚的希望自己能够从一名小菜成长为一名大鸟! 编写的程序应该满足: 1)可维护 2)可扩展 3)可复用 4)够灵活 废话少说,言归正传,设计模式原则之:合成复用原则 书面理解 合成复用原则:要尽量使用合成/聚合,尽量不要使用继承. 对象的继承关系是在编译时就定义好了,所以无法在运行时改变从父类继承的实现.子类

面向对象设计原则之合成复用原则

合成复用原则又称为组合/聚合复用原则(Composition/Aggregate Reuse Principle, CARP),其定义如下: 合成复用原则(Composite Reuse Principle, CRP):尽量使用对象组合,而不是继承来达到复用的目的. 合成复用原则就是在一个新的对象里通过关联关系(包括组合关系和聚合关系)来使用一些已有的对象,使之成为新对象的一部分:新对象通过委派调用已有对象的方法达到复用功能的目的.简言之:复用时要尽量使用组合/聚合关系(关联关系),少用继承.

设计模式的七大原则(7) --合成复用原则

前言 我们终于学习最后一个设计原则了,其实博主更新的还是挺慢的,因为我想一个一个吃透以后再继续学习,切记不要囫囵吞枣. 基本介绍 其实这个能说的内容很少,就是:尽量使用合成/聚合的方式,而不是使用继承 为什么要这样做?有一下两点原因: 通过继承来进行复用的主要问题在于继承复用会破坏系统的封装性,因为继承会将基类的实现细节暴露给子类,由于基类的内部细节通常对子类来说是可见的,所以这种复用又称"白箱"复用,如果基类发生改变,那么子类的实现也不得不发生改变:从基类继承而来的实现是静态的,不可

面向对象设计原则之六:组合/聚集复用原则

组合/聚合复用原则(Composite/Aggregate Reuse Principle CARP).组合和聚合都是对象建模中关联(Association)关系的一种.聚合表示整体与部分的关系,表示"含有",整体由部分组合而成,部分可以脱离整体作为一个独立的个体存在.组合则是一种更强的聚合,部分组成整体,而且不可分割,部分不能脱离整体而单独存在.在合成关系中,部分和整体的生命周期一样,组合的新的对象完全支配其组成部分,包括他们的创建和销毁.一个合成关系中成分对象是不能与另外一个合成关

大话设计模式笔记 合成/聚合复用原则

合成/聚合复用原则,尽量使用合成/聚合,尽量不要使用类继承. 聚合(Aggregation)表示一种弱的‘拥有’关系,体现的是A对象可以包含B对象但B对象不是A对象的一部分. 合成(Composition)则是一种强的'拥有'关系,体现了严格的部分和整体关系,部分和整体的生命周期一样. 优先使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上,这样类和类继承层次会保持较小规模,而且不太可能增长为不可控制的庞然大物. 继承是一种强耦合的结构.子类随父类改变而改变,一定要在是‘is-

设计模式六大原则——合成/聚合复用原则(CARP)

1.定义 简而言之,对于合成/聚合复用原则的定义就是:要尽量使用合成和聚合,尽量不要使用继承. 2.释义 为什么"要尽量使用合成和聚合,尽量不要使用继承"呢? 这是因为: 第一,继承复用破坏包装,它把父类的实现细节直接暴露给了子类,这违背了信息隐藏的原则: 第二:如果父类发生了改变,那么子类也要发生相应的改变,这就直接导致了类与类之间的高耦合,不利于类的扩展.复用.维护等,也带来了系统僵硬和脆弱的设计.而用合成和聚合的时候新对象和已有对象的交互往往是通过接口或者抽象类进行的,就可以很好

合成/聚合复用原则,桥接模式

问题: 方式一, 方式二, 存在问题: 继承带来的麻烦,无论是哪种方式,一旦功能增多.品牌增多,增长不可控的无限变大.增加一个品牌,增加m个软件类+1个品牌类:增加一个软件,增加n(品牌个数)软件个类. 对象的继承关系在编译时就定义好了,所以无法在运行时改变从父类继承的实现. 子类的实现与它的父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化. 当需要复用子类时.如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换.这种依赖关系限制了灵活性,并最终限

合成/聚合复用原则

合成/聚合复用原则:尽量使用合成/聚合,尽量不要使用类继承. 合成和聚合都是关联的特殊种类.聚合表示一种弱的'拥有'关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分; 合成则是一种强的'拥有'关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样. 合成/聚合复用原则的好处是:优先使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上.这样类和类继承层次会保持较小规模,并且不太可能增在为不可控制的庞然大物. 原文地址:https://www.cnblogs.co

合成/聚合复用原则(CARP)

组合/聚合复用原则(Composite/Aggregate Reuse Principle或CARP),就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分,新对象通过向这些对象的委派达到复用已有功能的目的.这两种都是关联关系的一种,聚合表示整体与部分的关系,部分可以脱离整体作为独立个体存在:组合是一种更强的聚合,部分组成整体,但部分不可作为独立个体单独存在,部分的生命周期不能超过整体的生命周期.聚合好比电脑与鼠标,组合好比人与心脏. 组合/聚合与继承是实现复用的两个基本途径,继承复