UML-类图和类图转化为代码

提示:文章详细的讲解了类图的四种关系,以及每种关系如何转化为对应的代码。

UML-类图和类图转化为代码

  • 一、类于类之间的关系
    • 1.依赖关系
    • 2.关联关系
      • (1) 单向关联
      • (2) 双向关联
      • (3) 自关联
      • (4) 聚合关联(has-a)
      • (5) 组合关联(contains-a)
    • 3.泛化关系(is-a)
    • 4.实现关系
  • 二、UML类图转化为代码
    • 1.依赖关系(Dependency)
    • 2.泛化关系(Generalization)
    • 3.关联关系(Association)
      • (1)单向关联
      • (2)双向关联
      • (3)自关联
    • 4.聚合关系(Aggregation)
    • 5.组合关系(Composition)
    • 6.实现关系(Implementation)
  • 三、类图转化为代码例题练习
  • 四、总结


一、类于类之间的关系

1.依赖关系

  • 依赖关系 是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系。
  • 依赖关系使用一个带箭头的虚线表示,箭头指向被依赖的对象(或被使用的对象)
    在这里插入图片描述

2.关联关系

  • 关联关系是类与类之间最常用的一种关系,它是一种结构化关系,用于表示一类对象与另一类对象之间有联系。
  • 关联的多重性:
    • 关联的多重性是指有多少对象可以参与关联,它可以用来表达一个取值范围、特定值、无限定的范围或者一组离散值。
    • UML 中关联的多重性用数字标识的范围来表示,其格式为 “minimum…maximum” ,其中 minimum 和 maximum 都表示 int 类型。
    • 多重性也可以使用符号 “*” 来表示一个没有上限或者说上限为无穷大的范围。
    • 赋给一个端点的多重性表示该端点可以有多个对象与另一个端点的一个对象关联。
      在这里插入图片描述

(1) 单向关联

  • 单向关联使用一个带箭头的实线来表示,箭头指向关联的一方
    在这里插入图片描述

(2) 双向关联

  • 双向关联使用实线表示,将两个类连接起来。
    在这里插入图片描述

(3) 自关联

  • 一个类可以与自己关联,这是可以将其称为自关联或者自身关联。
    在这里插入图片描述

(4) 聚合关联(has-a)

  • 简单理解:部分类可以脱离整体而存在。
  • 部分类的生命周期独立于整体类的生命周期,即部分类能够脱离整体而单独存在,称为聚合关系。
  • 聚合关系使用一个带空心菱形的实线来表示,空心菱形指向整体
    在这里插入图片描述

(5) 组合关联(contains-a)

  • 简单理解:部分类不能够独立存在。
  • 部分类的生命周期不独立于整体类的生命周期,即部分类不能够脱离整体而单独存在,称为组合关系。
  • 组合关系使用一个带实心菱形的实线来表示,实心菱形指向整体
    在这里插入图片描述

3.泛化关系(is-a)

  • 简单理解:继承关系
  • 泛化关系使用一个带三角箭头的实线来表示,箭头指向父类,即被继承的元素。
    在这里插入图片描述

4.实现关系

  • 简单理解:实现接口
  • 实现关系使用一个带三角箭头的虚线来表示,箭头指向接口,即被实现元素。
    在这里插入图片描述

二、UML类图转化为代码

1.依赖关系(Dependency)

  • 大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数。
    在这里插入图片描述
public class TV{private int color;public void change(Channel c){}public void turn_on(){}public void turn_off(){}
}
public class Channel{}

2.泛化关系(Generalization)

  • 通过 extends 关键字实现继承结构。
    在这里插入图片描述
public Tank{public void ram(){}public void radion(){}
}
public SpecialTank extends tank{}

3.关联关系(Association)

  • 关联关系表示为某个类以成员变量的形式包含其他类的对象。

(1)单向关联

在这里插入图片描述

public class ClassA{private ClassB classB;
}
public class ClassB{}

(2)双向关联

在这里插入图片描述

public class Company{private Person[] persons;
}
public class Person{private Company company;
}

(3)自关联

在这里插入图片描述

public class WorkerPerson{private WorkerPerson workerPerson;
}

4.聚合关系(Aggregation)

  • 作为成员变量利用构造方法赋值。
    在这里插入图片描述
public class Car{private Engien engien;private Wheel wheel;public Car(Engien engien, Wheel wheel){this.engien = engien;this.wheel = wheel;}
}

5.组合关系(Composition)

  • 作为成员变量在构造函数中实例化另一个对象。
    在这里插入图片描述
public OnePerson{private Head head;public OnePerson(){head = new Head();}
}
public class Head{}
...

6.实现关系(Implementation)

通过 implements 关键字实现。
在这里插入图片描述

public interface IMyInterface{public String g;public int i;public int charge();
}
public class MyClass implements IMyInterface{}

三、类图转化为代码例题练习

  • 在购物车例子中,Product 类表示一个商品,包含3个属性:id、名称和价格。Cart 类表示一个购物车,包含1个属性:产品列表,同时具有添加商品和计算商品总价的方法。User类表示一个客户,包含4个属性:姓名、邮件、密码和购物车列表。请根据描述画出类图、并用简单的代码实现用户添加商品计算价格功能
    在这里插入图片描述
public class User{private String name;private String email;private String password;private List<Cart> carts;public User(List<Cart> carts, String name, String email, String password){this.carts = carts;this.name = name;this.email = email;this.password = password;}
}
public class Product{private int id;public String name;public Float price;
}
public class Cart{public List<Product> products;public int add_product(int product){}public Float get_total_price(){float = 0.0;for(Product product : products){float += product.price;}}
}

四、总结

  • 这些关系之间的强弱程度不同,从强到弱的结果是:
    • 泛化关系=实现关系>组合关系(组合关联)>聚合关系(聚合关联)>关联关系(普通关联)>依赖关系
  • 代码转换小妙招:
    • 依赖关系和关联关系箭头指向的类都是“被动”的,写在另外一个类当中。
    • 泛化关系和实现关系三角箭头指向的都是父类或者接口。
  • 关于多重性记忆的小妙招:
    • 赋给一个端点的多重性表示该端点可以有多个对象与另一个端点的一个对象关联。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/410342.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Studio下载gradle反复失败

我的版本&#xff1a;gradle-5.1.1 首先检查设置路径是否正确&#xff0c;参考我的修改&#xff01; 解决方案 1.手动下载Gradle.bin Gradle Distributions 下载地址 注意根据编译器提示下载&#xff0c;我这要求下载的是bin 而不是all 2.把下载好的整个压缩包放在C:\Users\…

如何使用服务器?

文章目录 如何使用服务器&#xff1f;一、工具二、第一种方法三、第二种方法四、实例 个人经验 如何使用服务器&#xff1f; 本文详细介绍了如何利用服务器跑模型&#xff0c;具体流程如下&#xff1a; 一、工具 ToDeskPyCharm Professional移动硬盘JetBrains GatewayGit 二…

大模型背景下计算机视觉年终思考小结(一)

1. 引言 在过去的十年里&#xff0c;出现了许多涉及计算机视觉的项目&#xff0c;举例如下&#xff1a; 使用射线图像和其他医学图像领域的医学诊断应用使用卫星图像分析建筑物和土地利用率相关应用各种环境下的目标检测和跟踪&#xff0c;如交通流统计、自然环境垃圾检测估计…

Vue知识总结-下

VUE-组件间通信 组件的自定义事件 概述&#xff1a;是一种组件间通信的方式,适用于&#xff1a;子组件>父组件使用场景&#xff1a;A是父组件,B是子组件,B给A传递数据,那么需要在A组件中绑定自定义事件(事件的回调也在A中)使用步骤 绑定自定义事件&#xff1a; 第一种方式…

开机自启动android app

Android App开机自启动_android 开机自启动-CSDN博客 注意权限问题&#xff1a; 第二种实现方式&#xff1a;系统桌面应用 问&#xff1a;android的系统桌面应用启动是什么&#xff1a; 答&#xff1a; Android 系统桌面应用是指用户在设备主屏幕上看到的默认启动界面&…

现阶段Python和Java哪个更吃香?

现阶段Python和Java哪个更吃香&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Java的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&…

【Java】源码文件开头添加注释

需求 应公司质量部要求&#xff0c;需要对代码做静态检查。质量部要求&#xff0c;源码文件必须在起始行起设置一些注释&#xff0c;然而项目已经开发了一年之久&#xff0c;且没有维护这个注释。 此时&#xff0c;面对好几千个源码文件&#xff0c;我们如何快速添加相应的注…

软件工程应用题汇总

绘制数据流图(L0/L1/L2) DFD/L0&#xff08;基本系统模型&#xff09; 只包含源点终点和一个处理(XXX系统) DFD/L1&#xff08;功能级数据流图&#xff09;在L0基础上进一步划分处理(XXX系统) 个人理解 DFD/L2&#xff08;在L1基础上进一步分解后的数据流图&#xff09; 数据…

Unity关于新手引导中实现遮罩镂空效果

在新手引导每一步中实现可以遮掉其他部分而显示当前需要点击的部分&#xff0c;只需要在每一步引导的时候设置对应的镂空区域的RectTransform.效果如下图&#xff1a; 代码&#xff1a; public class SelfMaskSet : MaskableGraphic, ICanvasRaycastFilter {[SerializeField]p…

Matlab 求解非刚性微分方程(ode45)

语法 1、[t,y] ode45(odefun,tspan,y0) 2、[t,y] ode45(odefun,tspan,y0,options) 3、[t,y,te,ye,ie] ode45(odefun,tspan,y0,options) 4、sol ode45(___)描述 [t,y] ode45(odefun,tspan,y0) 其中&#xff0c;tspan [t0 tf] 为微分方程 odefun 的积分区间&#xff0c;y…

Unity之触发器

目录 &#x1f4d5;一、触发器概念 &#x1f4d5;二、碰撞与触发的区别 &#x1f4d5;三、触发器小实例 一、触发器概念 第一次玩侠盗猎车手是在小学&#xff0c;从那以后就开启了我的五星好市民之路。 下面是小编在小破站截的图&#xff0c;这是罪恶都市最开始的地方&a…

RabbitMQ交换机(1)

1.交换机Exchange RabbitMQ消息传递模型的核心思想是: 生产者生产的消息从不会直接发送到队列。实际上&#xff0c;通常生产者甚至都不知道这些消息传递传递到了哪些队列中。 相反&#xff0c;生产者只能将消息发送到交换机(exchange)&#xff0c;交换机工作的内容非常简单&am…