zoukankan      html  css  js  c++  java
  • 合成聚合原则

    1、合成聚合原则定义

    又叫做合成复用原则(Composite ReusePrinciple或CRP),尽量使用对象组合,而不是继承来达到复用的目的。就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新对象通过向这些对象的委派达到复用已有功能的目的。简而言之,要尽量使用合成/聚合,尽量不要使用继承。

    2、合成的定义

    合成(组合):表示一个整体与部分的关系,指一个依托整体而存在的关系(整体与部分不可以分开),例如:一个人对他的房子和家具,其中他的房子和家具是不能被共享的,因为那些东西都是他自己的。并且人没了,这个也关系就没了。虽然组合表示的是一个整体与部分的关系,但是组合关系中部分和整体具有统一的生存期。一旦整体对象不存在,部分对象也将不存在,部分对象与整体对象之间具有同生共死的关系。在组合关系中,成员类是整体类的一部分,而且整体类可以控制成员类的生命周期,即成员类的存在依赖于整体类。在UML中,组合关系用带实心菱形的直线表示。

    public class Head

    { private Mouth mouth;

    public Head()

      { mouth = new Mouth();

       }

    }

    public class Mouth

    {

    }

    3、聚合的定义

    聚合:聚合是比合成关系更弱的一种拥有关系,也表示整体与部分的关系(整体与部分可以分开),例如,一个奔驰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、原则分析

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

    4、两者之间的区别:依赖和关联

    依赖是类与类之间的连接,表示一个类依赖于另外一个类的定义。依赖关系仅仅描述了类与类之间的一种使用与被使用的关系,在Java中体现为局部变量、方法的参数或者是对静态方法的调用。

    依赖关系UML类图:

    static class Boat{ 

           public static void row(){ 

               System.out.println("开动"); 

           } 

    class Person{ 

            public void crossRiver(Boatboat){ 

                boat.row(); 

            } 

             

            public void fishing(){ 

                Boat boat =new Boat() ; 

                boat.row(); 

            }

           public void patrol(){ 

                Boat.row() ; 

           } 

    关联是类与类之间的连结。关联关系使一个类知道另外一个类的属性和方法。关联可以是双向的,也可以是单向的。体现在Java中,关联关系是通过成员变量来实现的。

    一般关联关系UML类图:

    class Computer{ 

        public void develop(){ 

           System.out.println("Develop "); 

        } 

    class Person{ 

           private Computer computer ; 

             

           public Person(Computer computer){ 

               this.computer = computer ; 

           } 

             

           public void work(){ 

               computer.develop() ; 

               System.out.println("work"); 

           } 

     } 

    参考博文链接:

    https://blog.csdn.net/liaoqianchuan00/article/details/8230459

    https://blog.csdn.net/u010832572/article/details/45007933?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

  • 相关阅读:
    debug和release转载
    坐标系与基本图元(8)
    坐标系与基本图元(7)
    坐标系与基本图元(5)
    坐标系与基本图元(6)
    坐标系与基本图元(4)
    坐标系与基本图元(3)
    坐标系与基本图元(2)
    BZOJ 1090
    Xor
  • 原文地址:https://www.cnblogs.com/leo1111/p/12537250.html
Copyright © 2011-2022 走看看