UML类图关系学习

    先说一下对几种关系的理解,包括:依赖、关联、聚合、组合、继承、实现,耦合依次增高。

1. 依赖

    依赖使用虚箭头表示,对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。在JAVA中,类A使用了类B,其中类B是作为类A的方法参数方法中的局部变量、或者静态方法调用时,这几种情况都是依赖,下图中的People类依赖于Food类,Food类是作为类中方法的参数形式出现在People类中的。

代码如下:

public class People {
    public void eat(Food cookie) {
        System.out.println("人们要吃"+cookie.getName());
    }
}

UML图如下:

UML类图关系学习

2. 关联

    关联分为单向关联和双向关联。对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时,这两个对象之间为关联关系。在JAVA中单向关联表现为:类A使用了类B,其中类B是作为类A的成员变量。双向关联表现为:类A当中使用了类B作为成员变量;同时类B中也使用了类A作为成员变量。

局部变量和成员变量主要是它们作用域的区别:

  • 成员变量在类内部;局部变量是定义在其方法体的内部(或者方法体内部的某一程序块内--大括号。主要看定义的位置)。
  • 成员变量可以不显示初始化,它们可以由系统设定默认值;局部变量没有默认度,所以必须设定初始值。
  • 在内存中的位置也不一定。成员变量在所在类被实例化后,存在于堆内存中;局部变量在所在方法被调用时,存在栈内存中。

单向关联代码:

public class Student{ 

   //关联关系中作为成员变量的类一般会在类中赋值 
    Teacher teacher = new Teacher(); 

    public void DoHomework(){ 
        System.out.println(“从”+teacher.getName()+”获得作业”); 
    }
} 
 
public class Teacher{ 
   public String getName() {
       return "王老师";
   }
}

单向关联UML图:

UML类图关系学习

双向关联代码:

public class Student{ 
   //关联关系中作为成员变量的类一般会在类中赋值 
    Teacher teacher = new Teacher(); 
    public void DoHomework(){ 
       System.out.println(“从”+teacher.getName()+”获得作业”); 
    } 

    public String getName() {
        return "李同学";
    }
} 
 
public class Teacher{ 
    Student student = new Student(); 
    public void giveHomework(){ 
       System.out.println(“给”+student.getName()+“留作业”); 
    }

    public String getName() {
        return "王老师";
    }
}

双向关联UML图:

UML类图关系学习或者UML类图关系学习

3. 聚合

    聚合关系属于关联关系,耦合度强于关联,代码表现是相同的,在语义上表现有所却别:关联关系的对象间是相互独立的,聚合关系的对象之间存在包容关系,是“整体-个体”的相互关系。

聚合案例代码如下:

public class Yanqun{ 
    Dayan dayan;    
    
    //聚合关系中作为成员变量的类一般使用set方法赋值 
    public void setDayan(Dayan dayan){ 
        This.dayan = dayan; 
    } 

    public void fly(){ 
       System.out.println(“大雁飞:”+dayan.fly()); 
    } 
}

聚合案例UML图如下:


4. 组合

    组合相比于聚合,组合是一个耦合性更强的关联关系。存在组合关系的类表示“整体-部分”的关联关系,“整体”负责“部分”的生命周期,共生共死;“部分”不能单独存活。大雁和翅膀之间是组合关系,当大雁的生命周期开始,就必须有翅膀;当大雁的生命结束时,翅膀也会跟着结束;翅膀是不能单独存在的,必须作为大雁的组成部分存在。

组合案例代码:

public class Dayan{
   
    Chibang chibang;  
    
    //组合关系中的成员变量一般会在构造方法中赋值 
    public Dayan(Chibangchibang){  
        This.chibang = chibang;  
    } 
 
    public void fly(){ 
       System.out.println(“飞行要用”+chibang.getName()); 
    } 
}

组合案例UML图:

UML类图关系学习

通过代码也可以看出聚合和组合明显的区别,组合关系时,是在构造函数时使用的,即,当大雁存在了,翅膀也跟着生成了。

5. 继承

    继承表示类与类(或接口与接口)之间的父子关系。在UML中,继承关系用实线+空心箭头表示,箭头指向父类。

继承案例代码:

public class Man extends HuMan {

}
继承案例UML图:

UML类图关系学习

6. 实现

    表示一个类实现一个或者多个接口的方法。接口定义好操作的集合,由实现类去完成接口的具体操作。在UML图中,实现关系用虚线+空心箭头表示。箭头指向接口。

实现案例代码:

public Apple implements Fruit {

}

实现案例UML图:

UML类图关系学习

7. 总结

    其实,聚合、组合是特殊的关联关系,继承和实现本质也是相同的;依赖是最弱的耦合关系,依赖和关联本质也是相同的,都在一个类中使用另一个类。


你可能感兴趣的:(UML类图关系学习)