文档章节

UML类图关系学习

chapin
 chapin
发布于 2015/01/15 22:33
字数 1259
阅读 39
收藏 2

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

1. 依赖

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

代码如下:

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

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图:


双向关联代码:

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图:

或者

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图:

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

5. 继承

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

继承案例代码:

public class Man extends HuMan {

}
继承案例UML图:

6. 实现

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

实现案例代码:

public Apple implements Fruit {

}

实现案例UML图:


7. 总结

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


© 著作权归作者所有

共有 人打赏支持
chapin
粉丝 20
博文 83
码字总数 102961
作品 0
成都
程序员
私信 提问
DDD理论学习系列(5)-- 统一建模语言

DDD理论学习系列——案例及目录 1.引言 上一节讲解了领域模型,领域模型主要是将业务中涉及到的概念以面向对象的思想进行抽象,抽象出实体对象,确定实体所对应的方法和属性,以及实体之间的...

圣杰
2017/06/05
0
0
Java 大白话讲解设计模式之 -- UML类图

声明:原创作品,转载请注明出处https://www.jianshu.com/p/2828874af134 这篇文章来总结下UML类图,本来不打算讲UML类图的,因为我在学习设计模式的时候,一遇到有关UML的就会自动忽略,一看...

蛇发女妖
2018/05/02
0
0
软考之UML图深入学习(2)

前言 经历过软考之后的UML图学习,对于九种图有了更加深入的认识,上一篇文章《软考之UML图深入学习(1)》中,介绍了UML建模工具是什么? 这篇文章继前文,进一步深入,从小编思考的UML图进...

m18633778874
2017/11/12
0
0
UML类图符号理论

前言 相信大家在学习UML类图的时候,最大的困难可能来自两个方面: 类图中各种关系的区别; 多种关系的符号记忆容易混淆; 本着"Do one thing and do it well."的原则,本文不介绍UML类图中各...

算法与编程之美
2016/02/18
276
3
实用UML知识——如何看懂UML传递的软件架构信息

前公司的技术交流大体是靠口授, 个人会采用一些简单的架构文档+ 口述的方式, 描述一个软件产品的整体架构. 并且, 大多数情况是, 先有代码, 后有文档的方式, 这样做有以下优点: 1. 关注软件结...

晨曦之光
2012/03/09
730
0

没有更多内容

加载失败,请刷新页面

加载更多

rabbitmq安装教程

RabbitMQ有Windows与Linux版本的,这里先写Windows版本的安装。 以前安装软件总是在百度上找某某安装教程,结果能按照教程安装好的软件真的不多。想起先前以为大牛说的一句话,去官网按照官网...

em_aaron
6分钟前
0
0
Android 贝塞尔曲线实践——波浪式运动

一、波浪效果如下 贝塞尔曲线自定义波浪效果的案例很多,同样方法也很简单,大多数和本案例一样使用二次贝塞尔曲线实现,同样还有一种是PathMeasure的方式,这里我们后续补充,先来看贝塞尔曲...

IamOkay
10分钟前
0
0
Nmap之防火墙/IDS逃逸

选项 解释 -f 报文分段 --mtu 指定偏移大小 -D IP欺骗 -sI 原地址欺骗 --source-port 源端口欺骗 --data-length 指定发包长度 --randomize-hosts 目标主机随机排序 --spoof-mac Mac地址欺骗 ...

Frost729
18分钟前
0
0
带你搭一个SpringBoot+SpringData JPA的环境

不知道大家对SpringBoot和Spring Data JPA了解多少,如果你已经学过Spring和Hibernate的话,那么SpringBoot和SpringData JPA可以分分钟上手的。 其实我在学完SpringBoot和SpringData JPA了之...

java菜分享
23分钟前
0
0
Chocolatey 在Window搭建一个开发环境

在看了(利用 Chocolatey 快速在 Windows 下搭建一个开发环境)后,准备从零开始 一、准备工作 1、用管理员权限启动:powershell,执行错误请参考(PowerShell因为在此系统中禁止执行脚本的解...

近在咫尺远在天涯
36分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部