通过简单例子 | 快速理清 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 参数可以没有 一个或多个 但是触发和使用一定要匹配. 创 ...
随机推荐
- Raid(0/1/5/10)
一.Raid需要的硬盘数量 1.raid 0: 最少1块硬盘(但是1块盘没有意义,至少2块才有实际意义) 2.raid 1: 最少2块硬盘 3.raid 5: 最少3块硬盘 4 ...
- Python网编之简单的聊天小程序
服务端: import socket sock = socket.socket() sock.bind(("127.0.0.1",8899)) sock.listen(5) whi ...
- 关于electron-vue打包后静态视频文件无法正常加载的问题解决方法
最近在使用electron-builder构建vue项目的时候发现在生产模式下视频可以正常加载并显示,但是一旦打包到开发环境下,视频就读取不出来了,控制台也并没有报错 一开始博主以为是路径问题,在将路 ...
- JDK7&JDK9处理异常新特性
1.JDK7新特性是在 try (定义对象,作用域就是try方法体) 复制一个文件实例: 复制文件的原理: 先从硬盘写出到内存中,创建文件输入流对象 FileInputStream fis; 中间是在 ...
- 网站URL如何SEO优化
前言 本文讲解网站的URL如何进行SEO优化,并在自己的WordPress博客echeverra中优化URL. 起因 对于SEO我了解的并不多,只知道SEO做的好,那么各大搜索网站搜索你网站相关内容时 ...
- vue-cli3 创建多页面应用项目
1.创建vue项目 cmd命令执行 vue create ruc-continuing 创建vue项目,项目名称:ruc-continuing 选择一个 preset(预置项),或自定义: 选择自 ...
- Influxdb数据库 - 基本操作
InfluxDB数据库的简介 InfluxDB是一个用于存储和分析时间序列数据的开源数据库,是一个基于 golang 编写,用于记录 metrics.events,进行数据分析. 主要特性有: 内置H ...
- JDBC-3(Transcation) ****
3.1 异常的使用说明 在工具类中(JDBCUtils)的方法最好声明异常(throws),以便后续实现类中去捕获这些异常. 工具类中捕获异常通常没有意义 eg:实现类中connection建立过程出 ...
- 使用uView UI+UniApp开发微信小程序--微信授权绑定和一键登录系统
在前面随笔<使用uView UI+UniApp开发微信小程序>和<使用uView UI+UniApp开发微信小程序--判断用户是否登录并跳转>介绍了微信小程序的常规登录处理和验 ...
- Centos7安装配置Gitlab-CE
GitLab介绍 GitLab:是一个基于Git实现的在线代码仓库托管软件,你可以用gitlab自己搭建一个类似于Github一样的系统,一般用于在企业.学校等内部网络搭建git私服. 功能:Gitl ...