UML类关系: 依赖、关联、聚合、组合、继承、实现

12年前
1. 依赖
Class B  {      static void a(){...}  }    Class A  {      // a. 类A的方法中使用类B作为参数      void a(B b){...}        // b. 类A的方法中使用类B的对象作为局部变量      void b(){ B b = new B(); }        // c. 类A的方法中使用类B的静态方法      void c(){ B.a(); }  }
以上特征表明类A依赖类B, 如果类B发生变化那么就可能要求类A也发生变化.

2. 关联
Class B  {      ...  }    Class A  {      B b0 = new B();      static B b1 = new B();  }
类B作为类A的一个属性存在(成员/静态), 关联可以单向/双向的.

3. 聚合/组合
Class B  {      ...  }    Class A  {      private B b;      public B getB(){ return b; }      public void setB(B b){ this.b = b; }  }
聚合与组合的代码表现形式是一样的,仅仅具有语义上的区别。
聚合与组合其实都是关联的特例,都是整体和部分的关系。他们的区别在于聚合的两个对象之间是可分离的,具有各自的生命周期。而组合往往表现为一种唇齿相依的关系。

聚合:一种容纳或者包含的关系,如同机场和飞机,汽车和轮胎的关系。

组合:也可称之为强聚合,整体和部分是不可分的,整体的生命周期结束时也就是部分的生命周期到头时。如桌子和桌子腿的关系。


4. 继承/实现
以下省略1W字......

一般情况下,当某个类被当作参数传递并且被当作结果返回的时候,或者被当作某个方法内的临时变量使用的时候,可以运用依赖关系,使用关联来表示一个拥有关系,而不是整体-部分关系。使用聚合来表示一个动态的整体-部分关系,而是用组合来表示一个静态的整体-部分关系。但是需要指出的是,所谓“关系”只是在某个问题域才有效,离开了这个问题域,可能这些关系就不成立了