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

问题:

  方式一,

  

  方式二,

  

  存在问题:

  继承带来的麻烦,无论是哪种方式,一旦功能增多、品牌增多,增长不可控的无限变大。增加一个品牌,增加m个软件类+1个品牌类;增加一个软件,增加n(品牌个数)软件个类。

  对象的继承关系在编译时就定义好了,所以无法在运行时改变从父类继承的实现。

  子类的实现与它的父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化。

  当需要复用子类时。如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换。这种依赖关系限制了灵活性,并最终限制了复用性。

解决方式:

  合成/聚合复用原则。即优先使用对象合成/聚合,而不是类继承。

合成/聚合复用原则,CARP

定义:

  尽量使用合成/聚合,尽量不要使用类继承。

  聚合表示一种弱的“拥有”关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分。

  合成表示一种强的“拥有”关系,体现了严格的部分和整体的关系,部分和整体的声明周期一样。

  

优点:

  优先使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上。这样类、类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。

实例:

  通过对象的职责来考虑问题,而不是结构来考虑问题。软件间、品牌间——合成;品牌与软件——聚合

  

  HandsetSoft:手机软件抽象类

  

  软件具体类

  

  HandsetSoft:品牌抽象类

  

  品牌具体类:

  

  

  客户端:

  

  优点:

  增加软件功能、手机品牌只需要增加一个类就可以了。

  符合“开放-封闭原则”,不会修改原来的代码,只是添加扩展类即可。

桥接模式

  将抽象部分与它的实现部分分离,使它们都可以独立地变化。

  抽象部分与它的实现部分分离?

  不是抽象类与派生类分离。实现,是指抽象类和它的派生类用来实现自己的对象。即手机,可按品牌分类,也可按功能分类。

  实现系统可能有多角度分类,每一种分类都有可能变化。就把这种多角度分离出来,让他们独立变化,减少它们之间的耦合。

  由于实现的方式有很多种,桥接模式的核心意图就是把这些实现独立出来,让它们各自地变化。这样就使得每种实现的变化不会影响其他实现,从而达到应对变化的目的。

  

结构图:

  

  Abstraction

  

  RefinedAbstraction

  

  客户端:

  

  

扩展:

  有了新锤子,所有的东西看上去都成了钉子。

  继承

  是一种强耦合的接口。

  父类变,子类就必须要变。盲目使用继承,会造成麻烦。  

  优先使用对象的合成会聚合,而不是类继承。使用继承时,一定要优先考虑“is-a”的关系之后,再考虑是否使用,而不是任何时候都去使用。

  当发现需要多角度去分类实现的对象,只用继承会造成大量的类增加,不能满足“开放-封闭原则”时,考虑用交接模式。

  只要真正深入地理解了设计原则,很多设计模式就是原则的应用而已。

时间: 2024-10-28 21:58:28

合成/聚合复用原则,桥接模式的相关文章

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

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

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

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

合成/聚合复用原则

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

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

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

设计模式之合成/聚合利用原则(CARP)

一.概念 CARP:CompositionAggregation Principle 合成聚合复用原则,尽量使用合成/聚合,尽量不使用类继承.合成聚合是"has  a"的关系,而继承是"is  a"的关系.由于继承是一中强耦合的结构,父类变,子类必变.所以不是"is  a"关系,我们一般不要用继承.优先使用合成聚合复用原则,有助于保持每个类的封装,降低继承的层次.合成/聚合复用原则就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分:

组合/聚合复用原则

组合/聚合复用原则(Composite/Aggregate Reuse Principle)是面向对象设计原则的一种.组合/聚合复用原则是指尽量使用组合/聚合,不要使用类继承.在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分,新对象通过向这些对象的委派达到复用已有功能的目的.就是说要尽量的使用合成和聚合,而不是继承关系达到复用的目的. 组合/聚合复用原则是什么 尽量采用组合(contains-a).聚合(has-a)的方式而不是继承(is-a)的关系来达到软件的复用目的 假如新对象的

面向对象设计原则九:组合/聚合复用原则

组合/聚合复用原则(LSP) 定义:优先使用组合,使系统更灵活,其次才考虑继承,达到复用的目的.重用的方式: 继承.组合.聚合解释说明: 继承:在我们想复用代码时,我们一般会优先想到继承,但是具有继承关系的两个类是耦合度最高的两个类.(父类改了子类可能会受影响,子类改了父类也可能会受影响) 如果父类的功能比较稳定,建议使用继承来实现代码复用,因为继承是静态定义的,在运行时无法动态调用. 组合:是整体与部分的关系,整体离不开部分,部分离开了整体没有意义,如飞机翅膀与飞机的关系. 聚合:也是整体与部

跟着实例学习设计模式(9)-桥接模式bridge(结构型)

桥接模式属于结构型设计模式. 设计意图:将抽象部分与实现部分分离,使它们都可以独立的变化. 一看到设计意图,大家可能有些发懵,我们看到的继承和接口不都是抽象和实现分离的吗?尤其是接口和抽象类都是这样的实现啊!那怎么还有这么个桥接的分离呢? 我们先来看个例子. 例如:汽车品牌内置导航仪,我们希望实现,每个品牌的导航仪都可以在任何一个牌子的汽车上安装并启动. 汽车品牌有两个:宝马.奔驰. 导航仪有三个牌子:神行者.北斗.高德. 来看正常的设计,我们肯定是会这样的采用继承来实现每个组合的安装和启动处理

C#面向对象设计之——桥接模式(八)

一.前言 桥接模式就是将抽象部分和它的实现部分分离,使它们都可以独立地变化.抽象与它的实现分离,实现是指抽象类和它的派生类用来实现自己的对象.就手机而言,手机既可以用品牌来分类,也可以以功能来分类. 在面向对象设计中,我们有一个很重要的原则:合成/聚合复用原则,即优先使用对象合成/聚合,而不是类继承. 对象的继承关系是在编译时就已经定好了,所以无法再运行时改变从父类继承发生的变化.当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写或者被其他更适合的类替换,这种依赖关系限制了