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


    问题:

      方式一,

      

      方式二,

      

      存在问题:

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

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

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

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

    解决方式:

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

    合成/聚合复用原则,CARP

    定义:

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

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

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

      

    优点:

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

    实例:

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

      

      HandsetSoft:手机软件抽象类

      

      软件具体类

      

      HandsetSoft:品牌抽象类

      

      品牌具体类:

      

      

      客户端:

      

      优点:

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

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

    桥接模式

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

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

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

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

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

      

    结构图:

      

      Abstraction

      

      RefinedAbstraction

      

      客户端:

      

      

    扩展:

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

      继承

      是一种强耦合的接口。

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

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

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

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

  • 相关阅读:
    [001]
    SpringBoot默认首页跳转设置
    Tomcat网站根目录设置
    SpringBoot获取前端传递JSON的几种方法
    MySQL调优性能监控之show profile
    MySQL新特性MTS
    Java线程池拒绝策略
    快速排序与荷兰国旗及Partition问题
    数据结构与算法之返回最小和问题
    MySQL之谓词下推
  • 原文地址:https://www.cnblogs.com/panpanwelcome/p/5599774.html
Copyright © 2020-2023  润新知