通过简单例子 | 快速理清 UML 中类与类的六大关系
关于封面:我想我们都会离开
类与类之间的六大关系
- 泛化 ( Generalization ) ---> 表继承关系
- 实现 ( Realization )
- 关联 ( Association )
- 聚合 ( Aggregation )
- 组合 ( Compostion )
- 依赖 ( Dependency )
前言:
最近学校在上统一建模语言 UML ,也是毕业设计中需要用到,做个小记录。
希望这篇文章能够给大家带来些许收获,让大家趁兴而归。
一、单个类的类图
一步一步来,我们先学学如何使用 UML 图来表示单个类。
我先把类贴下面:
package uml;
/**
* @Author: crush
* @Date: 2021-09-30 15:00
* version 1.0
*/
public class Person {
private String name;
private Integer age;
private static String school="某小学";
public static String nationality="中国";
public Person() {
}
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public static String getSchool() {
return school;
}
public static void setSchool(String school) {
Person.school = school;
}
public static String getNationality() {
return nationality;
}
public static void setNationality(String nationality) {
Person.nationality = nationality;
}
public void selfIntroduction(String name, Integer age, String school){
System.out.println("做一个自我介绍,我的名字是:"+name+",今年"+age+"岁了,来自于"+school);
}
}
这个类还是非常简单的哈,接下来就是要如何用一个类图来进行描述呢?
如下图:
解释:
上半部分是 Person 类的属性,下半部分是 Person 类的方法
- name:String描述的是:private String name;-号:表示为私有属性( private ),反过来 + :就表示 public
name:为属性名称
:xxx :是表示属性的类型的。此处为 String 类型
-School:String="某幼儿园":描述的是private static String school="某小学";下划线是表示此属性为 static(静态属性)
"某幼儿园" 表示有默认值。 其他同上。
+ getNationality():String描述的是public static void setNationality(String nationality) {
Person.nationality = nationality;
}
和上面基本一样,+ 表示 public ,下划线表示 static 修饰,getNationality() 表示方法名,String 表示返回值为String类型。
但是平时中,我们通常都是多个类之间有关系,不是个孤零零的孤寡老人。
二、多个类之间的关系
表达多个类之间的关系有以下六种:
- 泛化 ( Generalization ) ---> 表述继承关系 ( 三角箭头的实线,箭头指向父类 )
- 实现 ( Realization ) ( 三角箭头的虚线,箭头指向接口 )
- 关联 ( Association ) ( 普通箭头的实心线,指向被拥有者 )
- 聚合 ( Aggregation ) ( 空心菱形的实心线,菱形指向整体 )
- 组合 ( Compostion ) ( 实心菱形的实线,菱形指向整体)
- 依赖 ( Dependency ) ( 箭头的虚线,指向被使用者 )
三、继承和实现的类图
3.1、继承
【泛化关系】:是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。例如:老虎是动物的一种,即有老虎的特性也有动物的共性
1)代码
动物类:
public class Animal {
private String name;
private Integer age;
public Animal() {
}
public Animal(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
猫类继承动物类:
public class Cat extends Animal {
private String breeds;
public Cat(String name, Integer age, String breeds) {
super(name, age);
this.breeds = breeds;
}
public String getBreeds() {
return breeds;
}
public void setBreeds(String breeds) {
this.breeds = breeds;
}
public void selfIntroduction(String name,Integer age,String breeds){
System.out.println("我叫"+name+",是一只"+breeds+"品种的猫,今年"+age+"岁了,");
}
}
我们用类图来表示这个关系。
4)图示
箭头要用对,不然关系就完全不一样拉。
3.2、实现
【实现关系】:是一种类与接口的关系,表示类是接口所有特征和行为的实现.
1) 代码
吃睡接口,我们再让动物类来实现他两。
public interface Eat {
void eat();
}
public interface Sleep {
void sleep();
}
public class Animal implements Eat,Sleep{
private String name;
private Integer age;
public Animal() {
}
public Animal(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public void eat() {
System.out.println("吃东西");
}
@Override
public void sleep() {
System.out.println("睡觉");
}
}
2) 图示
四、关联关系的类图
【关联关系】:是一种拥有的关系,它使一个类知道另一个类的属性和方法;如:老师与学生,丈夫与妻子关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。
我们增添一个出身地的类,每个动物都会有一个出生地的地方。
我们将这个出生地和动物关联起来。
4.1、代码
/**
* @Author: crush
* @Date: 2021-09-30 19:11
* version 1.0
* 出生地
*/
public class Birthplace {
private String birthplace;
public Birthplace(String birthplace) {
this.birthplace = birthplace;
}
public String getBirthplace() {
return birthplace;
}
public void setBirthplace(String birthplace) {
this.birthplace = birthplace;
}
}
与动物类关联起来:
public class Animal implements Eat,Sleep{
private String name;
private Integer age;
private Birthplace birthplace;
public Animal() {
}
public Animal(String name, Integer age, Birthplace birthplace) {
this.name = name;
this.age = age;
this.birthplace = birthplace;
}
public Birthplace getBirthplace() {
return birthplace;
}
public void setBirthplace(Birthplace birthplace) {
this.birthplace = birthplace;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public void eat() {
System.out.println("吃东西");
}
@Override
public void sleep() {
System.out.println("睡觉");
}
}
在自我介绍方法中增添输出。
public class Cat extends Animal {
private String breeds;
public Cat(String name, Integer age,Birthplace birthplace, String breeds) {
super(name, age,birthplace);
this.breeds = breeds;
}
public String getBreeds() {
return breeds;
}
public void setBreeds(String breeds) {
this.breeds = breeds;
}
public void selfIntroduction(String name,Integer age,String breeds,Birthplace birthplace){
System.out.println("我叫"+name+",是一只"+breeds+"品种的猫,今年"+age+"岁了,出生于"+birthplace.getBirthplace());
}
}
4.2、图示
五、聚合和组合关系的类图
5.1、聚合
聚合 ( Aggregation ) : 是整体与部分的关系,且部分可以离开整体而单独存在。如车和轮胎是整体和部分的关系,轮胎离开车仍然可以存在。
聚合关系是关联关系的一种,是强的关联关系;关联和聚合在语法上无法区分,必须考察具体的逻辑关系。
先说说我这个例子,我们再写代码。
【例子】每台车都会有四个轮胎和一个引擎,轮胎离开车可以单独存在的,引擎同样也是。
1)代码
public class Wheel {
private String type;
public Wheel(String type) {
this.type = type;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public void move(){
System.out.println("滚动!!!");
}
}
public class Engine {
private String type;
public Engine(String type) {
this.type = type;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public void start(){
System.out.println("启动引擎!!!");
}
}
public class Car {
private Wheel wheel;
private Engine engine;
public Car(Wheel wheel, Engine engine) {
this.wheel = wheel;
this.engine = engine;
}
public Wheel getWheel() {
return wheel;
}
public void setWheel(Wheel wheel) {
this.wheel = wheel;
}
public Engine getEngine() {
return engine;
}
public void setEngine(Engine engine) {
this.engine = engine;
}
public void go(){
System.out.println("开车出去浪;啊");
}
}
用类图如何表示勒,接着往下看
2)图示
5.2、组合
组合 ( Composition ) : 是整体与部分的关系,但部分不能离开整体而单独存在。如公司和部门是整体和部分的关系,没有公司就不存在部门。还有如人由头和身体组成,没有了人,头和身体还咋存在勒。
组合关系是关联关系的一种,是比聚合关系还要强的关系,它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。
1)代码
public class Body {
private double size;
public Body(double size) {
this.size = size;
}
public double getSize() {
return size;
}
public void setSize(double size) {
this.size = size;
}
}
public class Head {
private double size;
public Head(double size) {
this.size = size;
}
public double getType() {
return size;
}
public void setType(double size) {
this.size = size;
}
}
public class Person2 {
private String name;
private Head head;
private Body body;
public Person2(String name, Head head, Body body) {
this.name = name;
this.head = head;
this.body = body;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Head getHead() {
return head;
}
public void setHead(Head head) {
this.head = head;
}
public Body getBody() {
return body;
}
public void setBody(Body body) {
this.body = body;
}
public void say(){
System.out.println("我会说话");
}
}
2)图示
六、依赖关系的类图
依赖(Dependency): 关系是一种使用关系,它是对象之间耦合度最弱的一种关联方式,是临时性的关联。在代码中,某个类的方法通过局部变量、方法的参数或者对静态方法的调用来访问另一个类(被依赖类)中的某些方法来完成一些职责。
在 UML 类图中,依赖关系使用带箭头的虚线来表示,箭头从使用类指向被依赖的类。如人与手机的关系图,人通过手机的语音传送方法打电话。
1、代码
public class Phone {
public void callUp(){
System.out.println("与人通话");
}
}
public class Person3 {
private String name;
public Person3(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void callUp(Phone phone){
System.out.println("使用手机打电话");
phone.callUp();
}
// 下面这种方式也是依赖关系
// public void callUp(){
// Phone phone=new Phone();
// System.out.println("使用手机打电话");
// phone.callUp();
// }
}
2、图示
七、类关系的强弱
强弱关系:泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖
另外我们常常说的降低耦合性,也是降低类与类之间的关系。
八、自言自语
今天的文章就到这里了。
如若在文章中遇到疑惑,请留言或私信,或者加主页联系方式,都会尽快回复。
如若发现文章中存在问题,望你能够指正,不胜感谢。
如果觉得对你有所帮助的话,请点个赞再走吧!
通过简单例子 | 快速理清 UML 中类与类的六大关系的更多相关文章
- 浅谈UML中类之间的五种关系及其在代码中的表现形式
本文转载:http://www.cnblogs.com/DebugLZQ/archive/2013/05/13/3066715.html 什么是类? 将某类东西归纳在一起,可以成为一个类. 类有很多种 ...
- Java 中类与类之间的关系
在java中类和类之间的关系基本上有依赖.关联.聚合.组合等 一.继承关系 继承指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功能的能力.在J ...
- UML类图介绍&类的六大关系
UML类图介绍&类的六大关系 官方定义 UML(统一建模语言),是一种用于软件系统分析和设计的语言工具,用于帮助软件开发人员进行思考和记录思路的方式 UML 图形化的语言 基本介绍 UML图: ...
- 【转】UML中类与类之间的5种关系表示
一.继承关系 继承指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功能的能力.在Java中继承关系通过关键字extends明确标识,在设计时一 ...
- UML中类图的四种关系及其代码实现
在uml图中 最复杂的也就是泛化,实现.依赖,关联.这四种关系了,假设弄清了这几种关系那么在理解UML图的时候就会变得轻车熟路了! 假设你对着几种关系一点都不熟悉的话能够看一下uml中的四种关系.这篇 ...
- UML中类图(Class Diagram)的关系整理
什么是UML类图? 类图显示了一组类.接口.协作以及他们之间的关系.在UML中问题域最终要被逐步转化,通过类来建模,通过编程语言构建这些类从而实现系统.类加上他们之间的关系就构成了类图,类图中还可以包 ...
- 设计模式之UML类图六大关系辨析【2】
六大关系:继承(extends).实现(Realization).依赖(use-a).关联(association).聚合(has-a).组合(强聚合)(Composition). 类与类之间的强弱关 ...
- 第一章 简单工厂模式 及 UML中类图的表示方法
写一个简单计算器程序时,可以写一个操作类,然后加.减.乘.除操作分别继承它,复写操作计算结果的方法.写一个简单工厂类,通过输入的操作符,使用操作类来new一个相应的操作类的子类对象.这样,工厂就实例化 ...
- 简单例子快速了解事件处理和委托 event delegate
以下仅仅是用最简单的方式表示事件,实际应用可能是不同窗体之间相互通知某些操作,达到触发. 首先声明一个degate的 EventHandler 参数可以没有 一个或多个 但是触发和使用一定要匹配. 创 ...
随机推荐
- Smooth
考场\(AC\),还是很开心的. 考虑这题让你干啥,就是给你一堆素数,然后让你用他们去构造数,求其中第\(k\)小的. 我们可以用系数累乘的方式,同时利用小根堆实现有序,加一个优化,就过了 ...
- python-request 实现企业微信接口自动化-1(DDT)
环境准备 python+requests 读取企业微信api开发文档,得知调用企业微信接口必须先获取企业微信的accesstoken是通过 ("corpid","&quo ...
- Ubuntu / CoreOS修改DNS配置
不要直接手动修改文件 /etc/resolv.conf 安装好Ubuntu之后设置了静态IP地址,再重启后就无法解析域名.想重新设置一下DNS,打开/etc/resolv.conf cat /etc/ ...
- Linux残留的EFI启动项删除后又恢复的问题
电脑Windows + Fedora双系统,UEFI启动,共用同一个EFI分区.现在删除了Fedora系统,那么应该将EFI分区中的Fedora启动项也删除之. 按照网上的办法,在Windows上,尝 ...
- python基础--网站推荐
Python教程 - 廖雪峰的官方网站 Python 基础教程 | 菜鸟教程 随笔分类 - 机器学习
- Prometheus 2.21.0 新特性
Prometheus 2.21.0 现在(2020.09.11)已经发布,在上个月的 2.20.0 之后又进行了很多的修复和改进. 这个版本使用了 Go 1.15 进行编译,不赞成在TLS证书验证中使 ...
- 308 day06_线程、同步
day06 [线程.同步] 主要内容 线程 同步 线程状态 教学目标 能够描述Java中多线程运行原理 能够使用继承类的方式创建多线程 能够使用实现接口的方式创建多线程 能够说出实现接口方式的好处 ...
- 【tp3.2】根据不同域名来加载不同的配置文件
遇到问题: 最近遇到一个需求,需要多个公众号使用同一个项目,这就导致了不同公众号访问的数据库和公众号配置不同. 解决思路: 查看文档:http://document.thinkphp.cn/manua ...
- Jmeter扩展组件开发(10) - 自定义扩展函数助手的开发
CODE package com.functions;import org.apache.jmeter.engine.util.CompoundVariable;import org.apache.j ...
- 深入HTML5第二天
sub(subscripted下标标签)和sup(superscripted上标标签) 内联元素:inline element span(范围标签):内联元素inline element 特性:没有 ...