• 合成聚合原则


    合成聚合原则

    定义:

    经常又叫做合成复用原则(Composite ReusePrinciple或CRP),尽量使用对象组合,而不是继承来达到复用的目的。

    就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新对象通过向这些对象的委派达到复用已有功能的目的。简而言之,要尽量使用合成/聚合,尽量不要使用继承。

    原则分析:

    1)在面向对象设计中,可以通过两种基本方法在不同的环境中复用已有的设计和实现,即通过 组合 / 聚合关系或通过 继承。
    继承复用:实现简单,易于扩展。破坏系统的封装性;从基类继承而来的实现是静态的,不可能在运行时发生改变,没有足够的灵活性;只能在有限的环境中使用。( “白箱”复用)
    组合/聚合复用:耦合度相对较低,选择性地调用成员对象的操作;可以在运行时动态进行。( “黑箱”复用)
    2)组合/聚合可以 使系统更加灵活,类与类之间的 耦合度降低,一个类的变化对其他类造成的影响相对较少,因此一般 首选使用组合 / 聚合来实现复用;其次才考虑继承,在使用继承时,需要严格遵循里氏代换原则,有效使用继承会有助于对问题的理解,降低复杂度,而滥用继承反而会增加系统构建和维护的难度以及系统的复杂度,因此需要 慎重使用继承复用。
    3)此原则和里氏代换原则氏相辅相成的,两者都是具体实现"开-闭"原则的规范。违反这一原则,就无法实现"开-闭"原则,首先我们要明白合成和聚合的概念:

    什么是合成 ?

    合成(组合):表示一个整体与部分的关系, 指一个依托整体而存在的关系( 整体与部分 不可以分开 ),例如:一个人对他的房子和家具,其中他的房子和家具是不能被共享的,因为那些东西都是他自己的。并且人没了,这个也关系就没了。这个例子就好像,乌鸡百凤丸这个产品,它是有乌鸡和上等药材合成而来的一样。 也比如网络游戏中的武器装备合成一样,多种东西合并为一种超强的东西一样。
    虽然组合表示的是一个整体与部分的关系,但是组合关系中部分和整体具有统一的生存期。一旦整体对象不存在,部分对象也将不存在,部分对象与整体对象之间具有同生共死的关系。
    在组合关系中,成员类是整体类的一部分,而且整体类可以控制成员类的生命周期,即成员类的存在依赖于整体类。 在UML中,组合关系用带实心菱形的直线表示。
     
    public class Head  
    {  
        private Mouth mouth;  
        public Head() {  
            mouth = new Mouth();  
        }  
    }  
    public class Mouth  
    {  
    }  


      什么是聚合 ?

    聚合: 聚合是比合成关系更弱的一种拥有关系,也表示整体与部分的关系(整体与部分可以分开),例如,一个奔驰S360汽车,对奔驰S360引擎,奔驰S360轮胎的关系..这些关系就是带有聚合性质的。因为奔驰S360引擎和奔驰S360轮胎他们只能被奔驰S360汽车所用,离开了奔驰S360汽车,它们就失去了存在的意义。在我们的设计中,这样的关系不应该频繁出现.这样会增大设计的耦合度。
    在面向对象中的聚合:通常在定义一个整体类后,再去分析这个整体类的组成结构,从而找出一些成员类,该整体类和成员类之间就形成了聚合关系。在聚合关系中, 成员类是整体类的一部分,即成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在。 在UML中,聚合关系用带空心菱形的直线表示。 
    比如汽车和汽车引擎:

    public class Car  
    {  
        private Engine engine;  
        public Car(Engine engine) {  
            this.engine = engine;  
        }  
        public void setEngine(Engine engine) {  
            this.engine = engine;  
        }  
    }  
    public class Engine  
    {  
    }  

    明白了合成和聚合关系,再来理解合成/聚合原则应该就清楚了。要避免在系统设计中出现,一个类的继承层次超过3次。如果这样的话,可以考虑重构你的代码,或者重新设计结构. 当然最好的办法就是考虑使用合成/聚合原则。
  • 相关阅读:
    Confluence 6 使用 LDAP 授权连接一个内部目录概述
    Confluence 6 导入 Active Directory 服务器证书
    Confluence 6 导入 Active Directory 服务器证书
    Confluence 6 导入 Active Directory 服务器证书
    Confluence 6 获得 Active Directory 服务器证书
    Confluence 6 安装 Active Directory 证书服务器
    Confluence 6 为 Active Directory 配置一个 SSL 连接预要求
    Confluence 6 为 Active Directory 配置一个 SSL 连接
    内容社交产品中的关键数据——获得良好反馈的用户比例
    基于Redis+Kafka的首页曝光过滤方案
  • 原文地址:https://www.cnblogs.com/zzn763754251/p/12542425.html
Copyright © 2020-2023  润新知