热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

UML类图与对应的代码归类总结【软件工程】

目录I.总述和预备知识II.关联(Association)关系III.聚合(Aggregation)关系IV.组合(Composition)关系V.泛化(Generalizatio

目录

    • I.总述和预备知识
    • II.关联(Association)关系
    • III.聚合(Aggregation)关系
    • IV.组合(Composition)关系
    • V.泛化(Generalization)关系
    • VI.依赖(Dependency)关系
    • VII.实现(Realization)关系
    • VIII.UML画法总结

I.总述和预备知识

常见的UML类图一共包含六种关系:关联(Association)、聚合(Aggregation)、组合(Composition)、泛化(Generalization)、依赖(Dependency)、实现(Realization)。

【预备知识】关于类图包含的通用元素,做一个简单的概括介绍:

在UML类图中,每个类使用包含类名、属性(field) 和方法(method)带有分割线的矩形来表示,比如下图表示一个员工类,它包含name、age和email三个属性,以及modifyInfo()方法

《UML类图与对应的代码归类总结【软件工程】》

这其中,属性和方法前分符号代表了这些属性和方法的可见性。UML类图中表示可见性的符号有三种:

+:表示public

-: 表示private

#:表示protected(friendly也归入这类)

另外,对类名、属性和方法的命名也有要求

类名:类名中每一个单词的首字母均大写 (Employee)

属性和方法名:属性名和方法名的命名按照驼峰命名法,名称中的第一个单词全部小写,之后每个单词仅首字母大写(modifyInfo)

最后,上面的这个UML的实例用Java代码表示为:

public class Employee {
private String name;
private int age;
private String email;

public void modifyInfo() {
......
}
}

下面从类图的六种关系逐一进行介绍。

II.关联(Association)关系

关联(Association)关系体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如用户和用户的地址。

这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的、关联可以是单向、双向的。

表现在代码层面,为被关联类B以类属性的形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量。

1️⃣单向关联

️UML图演示:

《UML类图与对应的代码归类总结【软件工程】》
以上是单向关联的实例,需要类Customer知道类Address,而不需要类Address知道类Customer,那么就是单向关联。在UML类图中,用实线连接有关联关系的对象所对应的类,并通过有无箭头区分不同的关联关系。

️Java代码演示:

public class Customer {
private Address address;
……
}
public class Address {
……
}

这里就是上述的:表现在代码层面为被关联类Address以类属性的形式出现在关联类Cusomer中

2️⃣双向关联

️UML图演示:

《UML类图与对应的代码归类总结【软件工程】》
以上是双向关联的实例,类Customer需要知道类Product,而类Product也需要知道类Cusomer,那么这两个类就应该是双向关联的。

️Java代码演示:

public class Customer {
private Product[] products;
……
}
public class Product{
private Customer customer;
……
}

3️⃣自关联

️UML图演示:

《UML类图与对应的代码归类总结【软件工程】》
以上是自关联的实例,自关联体现为类的属性类型为类本身,如链表、树结构。

️Java代码演示:

public class Node {
private Node subNode;
……
}

4️⃣多重性关联

️UML图演示:

《UML类图与对应的代码归类总结【软件工程】》
以上是多重性关联的实例。多重性关联关系又称为重数性(Multiplicity)关联关系,表示两个关联对象在数量上的对应关系。在UML中,对象之间的多重性可以直接在关联直线上用一个数字或一个数字范围表示

【补充】多重性与UML表示方式的对应关系:

UML表示方式多重性
1…1表示另一个类的一个对象只与该类的一个对象有关系
0…*表示另一个类的一个对象只与该类的零个或多个对象有关系
1…*表示另一个类的一个对象只与该类的一个或多个对象有关系
0…1表示另一个类的一个对象没有或只与该类的一个对象有关系
m…n表示另一个类的一个对象与该类最少m,最多n个对象有关系

️Java代码演示:

public class Form {
private Button[] buttons; //定义一个集合对象
……
}
public class Button {

}

III.聚合(Aggregation)关系

聚合(Aggregation)关系是关联关系的一种特例,体现的是整体与部分、拥有的关系,即has-a的关系。

此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。比如计算机与CPU、车和引擎的关系等。

️UML图演示:

《UML类图与对应的代码归类总结【软件工程】》
以上是聚合关系的实例。在UML中,聚合关系用带空心菱形的直线表示 ,整体指向部分,空心菱形靠近整体

️Java代码演示:

public class Car {
private Engine engine;
public Car(Engine engine) { //构造注入
this.engine = engine;
}

public void setEngine(Engine engine) { //设值注入
this.engine = engine;
}
……
}
public class Engine {
……
}

表现在代码层面,和关联关系是一致的,只能从语义级别来区分。

IV.组合(Composition)关系

组合(Composition)关系也是关联关系的一种特例,体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合

同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束。比如你的头和你的嘴巴。

️UML图演示:

《UML类图与对应的代码归类总结【软件工程】》
以上是组合关系的实例,在UML中,组合关系用带实心菱形的直线表示,整体指向部分,实心菱形靠近整体。

️Java代码演示:

public class Head {
private Mouth mouth;
public Head() {
mouth = new Mouth(); //实例化成员类
}
……
}
public class Mouth {
……
}

表现在代码层面,和关联关系是一致的,只能从语义级别来区分。

V.泛化(Generalization)关系

泛化(Generalization)关系是一种继承关系,用于描述父类与子类之间的关系,父类又称为基类或超类,子类又称为派生类是一种继承关系。

它表示一般与特殊的关系,指定了子类如何特化父类的所有特征和行为。例如:学生和老师是人类的一种,即有学生、老师的特性也有人类的共性。

️UML图演示:

《UML类图与对应的代码归类总结【软件工程】》
以上是泛化关系的实例,在UML中,泛化关系用带空心三角形的直线来表示,箭头指向父类。

️Java代码演示:

//父类
public class Person {
protected String name;
protected int age;
public void move() {
……
}
public void say() {
……
}
}
//子类
public class Student extends Person {
private String studentNo;
public void study() {
……
}
}

在代码实现时,使用面向对象的继承机制来实现泛化关系,在Java语言中使用extends关键字。

VI.依赖(Dependency)关系

依赖(Dependency)关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系,即一个类的实现需要另一个类的协助。

另外,在大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数。

️UML图演示:

《UML类图与对应的代码归类总结【软件工程】》
以上是依赖关系的实例,在UML中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。

️Java代码演示:

public class Driver {
public void drive(Car car)
{
car.move();
}
……
}
public class Car {
public void move() {
......
}
……
}

代码中体现为在Driver类中的drive方法内使用了Car类的对象。

VII.实现(Realization)关系

实现(Realization)关系是一种类与接口的关系,表示类是接口所有特征和行为的实现。在这种关系中,类实现了接口,类中的操作实现了接口中声明的操作。

️UML图演示:

《UML类图与对应的代码归类总结【软件工程】》
以上是实现关系的实例,在UML中,类与接口之间的实现关系用带空心三角形的虚线来表示,三角箭头指向接口。

️Java代码演示:

public interface Vehicle {
public void move();
}
public class Ship implements Vehicle {
public void move() {
……
}
}
public class Car implements Vehicle {
public void move() {
……
}
}

代码中,Java使用关键字interface定义接口类,并用关键字implements定义实现。

VIII.UML画法总结

类之间的关系UML画法
关联关系实线连接,有无箭头表明单双向。
聚合关系空心菱形直线表示 ,整体指向部分,空心菱形靠近整体。
组合关系实心菱形直线表示,整体指向部分,实心菱形靠近整体。
泛化关系空心三角形直线表示,箭头指向父类。
依赖关系箭头虚线表示,由依赖的一方指向被依赖的一方。
实现关系空心三角形虚线表示,三角箭头指向接口。

推荐阅读
  • 数据库设计:从ER模型和UML模型到关系模型的转换及相关公式解析
    本文根据b站鲁老师的教学视频整理而来,可能会偏理论化,有点枯燥,但是如果认真看完,还是会有所收获哒。从本文可以学习到 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • C#多线程解决界面卡死问题的完美解决方案
    当界面需要在程序运行中不断更新数据时,使用多线程可以解决界面卡死的问题。一个主线程创建界面,使用一个子线程执行程序并更新主界面,可以避免卡死现象。本文分享了一个例子,供大家参考。 ... [详细]
  • Java图形化计算器设计与实现
    本文介绍了使用Java编程语言设计和实现图形化计算器的方法。通过使用swing包和awt包中的组件,作者创建了一个具有按钮监听器和自定义界面尺寸和布局的计算器。文章还分享了在图形化界面设计中的一些心得体会。 ... [详细]
  • vb.net不用多线程如何同时运行两个过程?不用多线程?即使用多线程,也不会是“同时”执行,题主只要略懂一些计算机编译原理就能明白了。不用多线程更不可能让两个过程同步执行了。不过可 ... [详细]
  • 第四单元和课程总结:简单的架构设计意识
    一、第四单元架构设计总结第一次作业由于需要按名查找类图模型,于是建立"Class"类进行管理由于方法具有参数导致类中存在二级结构 ... [详细]
  • 开发笔记:里氏替换原则
    本文由编程笔记#小编为大家整理,主要介绍了里氏替换原则相关的知识,希望对你有一定的参考价值。1.定义:如果对每一个类型为T1的对象o1,都有类型为T2的对象o2, ... [详细]
  • Androidwifi对象属性及简易Demo本章介绍Android开发中WiFi热点和WiFi属性的获取,介绍WiFi的名称、状态等属性以及获取周围 ... [详细]
  • 大话设计模式职责链模式的实践请求加薪
    UML申请***申请*publicclassRequest{privateStringtype;privateStringcontent;privateintnum;publi ... [详细]
  • 源代码:Num1rescmpp1!idStr1Trim(rescmpp1!Callno)Str2Trim(rescmpp1!kh)Text2(0) ... [详细]
  • 思考题|传统_一本教你如何编写高质量代码的图书:《设计模式之美》
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了一本教你如何编写高质量代码的图书:《设计模式之美》相关的知识,希望对你有一定的参考价值。软件工程师都很重视代码质量&#x ... [详细]
author-avatar
百合想你511
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有