【UML建模】类图(Class Diagram)
1.概述在我们的日常学习、工作、测验以及面试的过程中,都会使用到类图,它是一种表现体系中的类、接口、属性和方法等静态结构的图形语言,常用于面向对象的软件计划、分析,对技能实现起到指导作用,是架构师的常用工具之一。
通过类图,可以更好地理解体系的结构和计划,进步开发效率和软件质量。对于学习过计划模式的同砚来说,肯定会有更深刻的感触,正是因为有类图我们更直观的理解各种模式的实现方式,并按照类图的指导去完成我们自己的计划模式代码。
综上,能够看懂并画出类图就显得尤为重要了,本篇重要是陈诉范例中的核心概念以及使用方式,重要包罗:
[*]类、属性、方法、访问权限的表现方式
[*]类与类之间的关系及其符号表现方式
[*]基数的使用
在类图中,每个类都被表现为一个矩形框,此中包含类的名称、属性和方法,类之间的关系可以通过不同的关系符号来表现,下面我们直接切入主题。
2.类的表现方式
体现形式即我们可以通过什么样的图形来体现出类所包含的信息,例如类与接口怎样表现,怎样表现属性与方法,怎样表现访问权限。
2.1.类与接口
类和接口在范例中都是用矩形的方框来表现,方框分为两层,在第一层中会写接口名和类名,接口的第一层方框中还会用<<interface>>来表现,如下图所示:
https://img-blog.csdnimg.cn/0ead130d2f2946bdb1a71cccdd35ce92.png
2.2.属性、方法、访问权限
在方框的第二行,则会写属性与方法,在属性和方法的左边还会用一些符号来表现访问权限,如下图:
https://img-blog.csdnimg.cn/7e7950f1110447f1a3f07f778e17e2ab.png
[*]+:表现 public
[*]-:表现 private
[*]#:表现 protected
[*]无符号:表现 default
从上图我们发现属性和方法是放在同一层的,现在的写法还比较直观,但是当属性和方法变多,且不按照顺序来写的时间就会显得有点杂乱,不能直观的看出类的结构。
所以,还有另一种画类图的方式,将类图的方框隔离为三层,第二层定义属性,第三层定义方法。按照新的格式得到新的类图如下:
https://img-blog.csdnimg.cn/2e8b9a5bd1954050a4a6ab4047f78f8b.png
假如是初期的范畴划分建模,可以使用两层方框的表现方式,乃至只必要单层的方框填入类名即可,不必要填入大量的属性和方法,这种方式在初期建模时会更加简洁明了。假如是在做较具体的技能实现,建议使用具有3层方框的表现方式,这种方式整理的信息更加丰富和清楚。
3.类之间的关系
类之间的关系一共有6种,耦合程度由强到弱可以表现为:
实现 = 泛化 > 组合 > 聚合 > 关联 > 依赖
[*]实现(Realization):表现类和接口之间的实现关系。
[*]泛化(Generalization):表现类之间的继承关系,也被叫做继承。
[*]组合(Composition):表现一个类对象包含另一个类对象,强团体与部门的关系。
[*]聚合(Aggregation):表现一个类对象包含另一个类对象,弱团体与部门的关系。
[*]关联(Association):表现一个类对象包含另一个类对象,是一种静态的关系。
[*]依赖(Dependency):表现一个类在其方法中使用到了另一个类,但两者之间不具有长期性的包含关系。
只是看这样的解释,可能还是不太相识各个关系之间的区别到底是什么,尤其是组合、聚合、关联看起来都差不多。但是没有关系,在下面的内容中会有“说人话”的方式来具体解释各个关系。
3.1.继承与实现
继承与实现在类图中体现为is-a的关系,通过空心三角形来表现,此中实现用虚线表现、继承用实现表现。
空心三角形画在父类或父接口这一端,下图分别表现了类B实现接口A,类B继承类A的关系:
https://img-blog.csdnimg.cn/6c6a8386c79a4a4f85efb8186ffbd3b3.png
继承与实现大家都是比较认识的,这里就不过多的赘述。
3.2.关联、聚合、组合
关联关系是类图中最不容易区分清楚的部门,聚合与组合是关联关系的一种特殊的体现形式,它们三种都是has-a的关系。
关联关系表现为实线,聚合和组合是在关联的基础上加入了菱形来表现,聚合表现为空心菱形,组合表现为实心菱形。
假如将一个类作为包含类,那么它的成员变量中的类就是成员类,菱形是画在包含类这一端,如下图:
https://img-blog.csdnimg.cn/4338eb8748304a10b73092914ff53fd3.png
上图中的表达的关系,从上到下分别为:
[*]类A与类B存在关联关系(这个关联关系并不明确,有可能是双向关联)
[*]类B是类A的一部门
[*]类A中包含了类B
上面的表现方式是部门教程了较为尺度的一种画法,但有时间也会看到另一种画法,在实现上会带上箭头,如下图所示:
https://img-blog.csdnimg.cn/ff5a0eac800e40dca0c9ed877341c9ab.png
在这张图中关联关系带上了箭头,表现的是单项的关联关系,即类A中关联了类B,而组合与聚合表达的含义与上面不带箭头的图同等。
之所以要学习这种画法,重要是在看资料的时间遇到两种不同的画法都能看得懂。
3.2.1.用代码表达关联关系
所谓的关联关系,就是一个类中使用了另一个类作为成员变量,至于这个成员变量是怎样被使用的,并不是关联关系必要关注的。
例如现在存在两个类门生Student和课程Course的双向关联关系,如图:
https://img-blog.csdnimg.cn/a3fde0a0d8114f11aa94812ecb38fa69.png
class Student {
Course course;
}
class Course {
Student student;
}
同理,假如是单向关联,则可以表现为:
https://img-blog.csdnimg.cn/7f4b37f3e8e044d6a9cc4ee631295ba4.png
class Student {
Course course;
}
class Course {
}
3.2.2.用代码表达组合关系
组合是一种强has-a关系,它要求的是一个类中有另一个类作为其成员变量的条件下,成员类依赖于包含类的生命周期,简单的说,就是两个类的生命周期同等,一荣俱荣,一损俱损。
例如现在有一个Person类,它引入了一个Heart作为成员变量:
https://img-blog.csdnimg.cn/20e86aad4960485890d281df75f945a4.png
Heart会在Person的构造函数中被new出来,随Person的创建而创建,同时当Person被烧毁后回收后,Heart没有了引用也会被回收掉。
class Person {
private Heart heart;
public Person() {
this.heart = new Heart();
}
}
class Heart {
}
3.2.3.用代码表达聚合关系
组合是一种弱has-a关系,与组合关系不同的是,成员类不会依赖包含类的生命周期,简单的说,即使是某个类被烧毁了,它的成员类也不会被烧毁。
例如现在有一台电脑Computer,接入了一个键盘Keyboard,即使电脑坏了,我这个键盘还可以接入到其他的电脑上使用:
https://img-blog.csdnimg.cn/cdcdda63b63d47f08c7c46b1f621a283.png
我们可以通过构造方法大概setter方法将键盘注入到电脑中:
class Computer {
private Keyboard keyboard;
// 通过构造方法的参数注入
public Computer(Keyboardkeyboard) {
this.keyboard= keyboard;
}
// 通过setter方法注入
public void setKeyboard() {
this.keyboard= keyboard;
}
}
class Keyboard {
}
相名誉过Spring的同砚,一定对上面的这段代码非常认识,这就是我们常说的构造方法注入与set注入,不丢脸出,Spring中的依赖实现方式大多是通过聚合的方式来实现的。
3.3.依赖
依赖在类图中也是has-a的关系,表达的是一个类在它运行自己函数的过程中使用到了另一个类,函数没有运行的时间就不会使用到这个类。
依赖关系也可以算作是一种特殊的关联关系,我们从类图中就可以看出来,依赖关系的类图是由虚线+箭头构成(关联是实线+箭头)。下图表现的是类A中使用到了类B
https://img-blog.csdnimg.cn/a167348825f84fd6bc63c34e4e4d91e8.png
3.3.1.依赖关系的代码实现
依赖关系在代码中往往表现为方法的形参以及局部变量,以一个简化版的工厂模式为例,提供一个汽车工厂CarFactory,在这个工厂中可以生产汽车Car。
https://img-blog.csdnimg.cn/44d2495f36814ee7be39ce7d63829a34.png
class CarFactory {
public Car crateCar() {
return new Car();
}
}
class Car{
}
4.基数
基数(multiplicity) 在有些课本上也叫多重度(multiplicity)也叫,用来表现关联的类之间的数目关系,也就是我们常说的一对一 , 一对多 , 多对多,上述的4种关系关联、组合、聚合、依赖中都可以添加基数。
基数由数字 , * , .. 构成,数字表现的是类的具体数目,* 表现的是0个或多个的意思,而..是两个符号之间的连接符,用于表现一个区间关系,例如:
[*]1:表现1个
[*]0..1:表现0个或1个
[*]0..*:表现0个或多个,也可以直接用*表现
[*]1..*:表现1个或多个
基数的符号是写在关系的连线两端的,以上面的门生选择课程为例,一个门生至少选择1门课程,学有余力的可以选择多门,则可以通过下面的图形来表现:
https://img-blog.csdnimg.cn/91af720cbf5e455685cb01d579d7ffa8.png
写成代码,就是成员变量Course由一个对象,修改为一个聚集:
class Student {
List<Course> courses;
}
class Course {
}
5.总结
本篇重要是在陈诉怎样通过图形语言来描述类和接口,类之间的关系以及基数,通过本篇文章中的知识点,我们已经根本可以看懂并计划自己的类图了。当然,类图的画法是多种多样的,本篇文章中并没有例举完整,例如在菜鸟教程中搜刮计划模式,你可能会看到这样的类图:
https://img-blog.csdnimg.cn/df543014bdb44c4d943286f96b47d3e3.png
在这张图中,关系的表达方式与上述的表达方式不太相同,是使用同一箭头加描述的方式来表达的,但相信大家有了本篇文章的基础之后,看到这样的类图也不会有什么压力,所以我们在日后的工作学习中继续查漏补缺即可。
最后,再总结一下本篇中的几个重点知识点:
[*]类的表现方式:掌握类的画法
通过一个划分为3层的方框来表现,第一层是名字、第二层是属性、第三层方法,假如是接口,可以在第一层的第一行写上<<interface>>。
[*]关系:代表各种关系的图标,以及关联、组合、聚合、依赖的区别
[*]图标:
[*]继承与实现是空心三角形,继承是实线,实线是虚线
[*]关联与依赖是箭头,关联是实线、依赖是虚线
[*]组合与聚合是菱形,组合是实心菱形,聚合是空心菱形
[*]关联和依赖的区别:关联是成员变量,依赖是局部变量
[*]组合与聚合的区别:组合中的成员类与包含类有相同的生命周期,而聚合中成员类有自己独有的生命周期
[*]基数:基数的含义与表现方式
[*]含义:用于表达关联的类之间的数目关系
[*]表现方式:写在关联连线的两端,有一对一 , 一对多 , 多对多三种,必要注意0..*与*表现的是同一个意思,即:0个或多个
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]