UML类图的几种关系及对应java代码

zuo在UML类图中,常见的有以下几种关系: 依赖(Dependency),关联(Association),泛化(Generalization), 实现(Realization),聚合(Aggregation),组合(Composition)

UML类图中的五种关系的耦合强弱比较:依赖<关联<实现<继承<聚合<组合

下面,我们详细说说每一个关系:

一、依赖(Dependency)关系

说明:它描述一个对象的修改会导致另一个对象的修改这样的关系。当表示一个事物使用另一个事物时,就运用依赖。

           在 UML 中,如果一个元素(客户)使用或者依赖于另一个元素(供应者),那么这两个元素之间就存在依赖关系。(https://www.ibm.com/support/knowledgecenter/zh/SSCLKU_7.5.5/com.ibm.xtools.modeler.doc/topics/cdepend.html)

可描述为:Use a(使用了其他对象)

表示:依赖关系是用一条带箭头的虚线表示的

图例:

           

关系强弱:依赖是类的六种关系中耦合最弱的一种关系。

举例:Animal(动物)依赖Oxygen(氧气)

类图:

代码体现(对应java代码):

一个类的对象作为另一个类的方法参数传入

//氧气类作为动物类中某个方法的参数
Public class Animal {
   Public Metabolism(Oxygen oxygen) {
             
      }
}

二、关联(Association)关系

说明:它描述不同类的对象之间的结构关系,他在一段时间内将多个类的实例连接在一起。

           在 UML 模型中,关联是指两个类元(例如,类或用例)之间的关系,这两个类元用来描述该关系的原因及其管理规则。(https://www.ibm.com/support/knowledgecenter/zh/SSCLKU_7.5.5/com.ibm.xtools.modeler.doc/topics/cassn.html?pos=2

表示:关联关系是用一条直线(加箭头)表示的

           关联关系分为单向关联和双向关联。在java中,单向关联表现为:类A当中使用了类B,其中类B是作为类A的成员变量。双向关联表现为:类A当中使用了类B作为成员变量;同时类B中也使用了类A作为成员变量。

图例:

           

强弱:关联关系用实线,表示类之间的耦合度比依赖强。

举例:Penguin(企鹅)和Climate(气候)

类图:

代码体现(对应java代码):

1.一个类的对象作为另一个类的成员变量传入或者返回值

//企鹅类引用气候对象
Public class Penguin {
  private Climate climate;
}

2.一个类作为另一个类方法里的局部变量

//气候类企鹅类方法里的局部变量
Public class Penguin {
  public void print(){
     Climate climate;
  }
}

小结:

依赖关系VS关联关系

1、从类的属性是否增加的角度看

  (1)发生依赖关系的两个类都不会增加属性。其中的一个类作为另一个类的方法的参数。

  (2)发生关联关系的两个类,其中的一个类成为另一个类的属性,而属性是一种更为紧密的耦合,更为长久的持有关系。

2、从关系的生命期角度看:

  (1)依赖关系是仅当类的方法被调用时而产生,伴随着方法的结束而结束了。

  (2)关联关系是当类实例化的时候即产生,当类销毁的时候,关系结束。相比依赖讲,关联关系的生存期更长。

三、泛化(Generalization)关系(也叫继承关系)

说明:泛化关系表示一个类对一个类的继承,继承而得的类成为后代,被继承类成为祖先。继承意味着祖先的定义(包括任何特征,如属性、关系或对其对象执行的操作)对于后代的对象也是有效的。泛化关系是从后代类到其祖先类的关系。

          泛化是一般类目(称为超类或父类)和较特殊的类目(成为子类或孩子类)之间的关系。

          在 UML 建模中,如果一个模型元素(子代)基于另一个模型元素(父代),那么这两个元素之间就存在泛化关系。(https://www.ibm.com/support/knowledgecenter/zh/SSCLKU_7.5.5/com.ibm.xtools.modeler.doc/topics/cgeneral.html?pos=2

表示:泛化关系是用一条带空心箭头的直线表示的

可描述为:Is a

图例:

           

举例:Bird(鸟)和Animal(动物)

类图:

代码体现(对应java代码):

//鸟类继承动物类
Public class Bird extend Animal{
  
}

四、实现(Realization)关系

说明:实现所代表的含义是,基本用例描述了一个业务目标,但是该业务目标有多种可能的实现途径,每一种实现途径可以用用例实现(或称用例实例)来表示,而用例实现与基本用例之间就构成了实现关系

           在 UML 图中,实现关系是类元与提供的接口之间的私有类型的实现关系。实现关系指定在实现类元时必须遵守提供的接口指定的合同。(https://www.ibm.com/support/knowledgecenter/zh/SSCLKU_7.5.5/com.ibm.xtools.modeler.doc/topics/cimplement.html

表示:实现关系是用一条带空心箭头的虚线表示的

图例:

           

举例:Bird(鸟)和Animal(动物)

类图:

代码体现(对应java代码):

//大雁实现飞翔接口
Public class WideGoose impment IFly{
  
}

小结:泛化关系VS实现关系

五、聚合(Aggregation)关系

说明:聚合关系用于类图,特别用于表示实体对象之间的关系,表达整体由部分构成的语义。        

          在 UML 模型中,聚集关系显示一个类元是另一个类元的一部分或者从属于另一个类元。

          聚集是一种特殊类型的关联,在这种关联中,各个对象组装或配置在一起以创建更复杂的对象。聚集描述了一组对象以及您如何与它们进行交互。聚集通过在表示组装的对象中定义称为聚集的单个控制点来保护对象的组装完整性。聚集还使用控制对象来决定组装对象如何对可能会影响集合的更改或指令作出响应。

https://www.ibm.com/support/knowledgecenter/zh/SSCLKU_7.5.5/com.ibm.xtools.modeler.doc/topics/caggreg.html

可描述为:Has a

表示:实现关系是用一条带空心菱形的直线表示的

图例:

           

强弱:类之间的耦合度比组合弱。

举例:WideGooseAggregate(雁群)和WideGoose(大雁)

类图:

代码体现(对应java代码):

在成员变量里一对多的关系

//大雁作为成员变量传入雁群类
Public class WideGooseAggregate{
    List<WideGoose> wideGooses
}

作为构造方法的参数传入 ,参数在其他地方实例化

//Context类
Public class Context{ 
    private State state;
    Public Context(State state) {
              this.state= state;
    }
}

//客户端
public class Client {
    public static void main(String[] args) {
        Context c=new Context(new ConcreteStateA());
    }
}

  

五、组合(Composition)关系

说明:组合关系用于类图, 特别用于表示实体对象关系,表达整体拥有部分的语义。

          组合关系是一种强依赖的特殊聚合关系,体现了严格的部分与整体的关系,如果整体不存在了,则部分也将消亡,部分和整体的生命周期一样。   

          在 UML 模型中,聚集关系显示一个类元是另一个类元的一部分或者从属于另一个类元。

         组合关系表示整体与部分的关系,并且是一种聚集形式。组合关系指定部分类元的生存期取决于完整类元的生存期。

https://www.ibm.com/support/knowledgecenter/zh/SSCLKU_7.5.5/com.ibm.xtools.modeler.doc/topics/ccompasn.html

可描述为:Contains a

表示:实现关系是用一条带实心菱形的直线表示的

图例:

           

强弱:类之间的耦合度比聚合强。

举例:Bird(鸟)和Wing(翅膀)

类图:

代码体现(对应java代码):

在构造函数里一对多的关系

//在鸟Bird类中,初始化时,实例化翅膀Wing,他们之间生命周期一样
Public class Bird{
    private Wing wing;
    Public Bird(){
        wing=New Wing();
}

小结:组合关系VS聚合关系

1、构造函数的角度

          聚合类的构造函数中包含了另一个类作为参数。 雁群类(GooseGroup)的构 造函数中要用到大雁(Goose)作为参数传递进来。大雁类(Goose)可以脱离雁群类而独立存在。

         组合类的构造函数中包含了另一个类的实例化。 表明鸟类在实例化之前,一定要先实例化翅膀类(Wings),这两个类紧密的耦合在一起,同生共灭。鸟类(Bird)是不可以脱离翅膀类(Wings)而独立存在。

2、信息的封装性角度

         在聚合关系中,客户端可以同时了解雁群类和大雁类,因为他们都是独立的。

         在组合关系中,客户端可以只认识鸟类,根本就不知道翅膀类的存在,因为翅膀类被严密的封装在鸟类中。

猜你喜欢

转载自blog.csdn.net/hejingfang123/article/details/111871668