2. 设计模式-详解UML类图
2.UML
目录
2.1 UML基本介绍
- UML——Unified modeling language UML (统一建模语言),是一种用于软件系统分析和设计的语言工具,它用于帮助软件开发人员进行思考和记录思路的结果
- UML本身是一套符号的规定,就像数学符号和化学符号一样,这些符号用于描述软件模型中的各个元素和他们之间的关系,比如类、接口、实现、泛化、依赖、组合、聚合等。
画UML图与写文章差不多,都是把自己的思想描述给别人看,关键在于思路和条理,UML图分类:
- 用例图(use case)
- 静态结构图: 类图、对象图、包图、组件图、部署图
- 动态行为图:交互图(时序图与协作图)、状态图、活动图
- 说明: 类图是描述类与类之间的关系的,是UML图中最核心的部分。
2.2 UML类图
- 用于描述系统中的类(对象)本身的组成和类(对象)之间的各种静态关系。类图是面向对象建模的主要组成部分。
- 类之间的关系: 依赖、泛化(继承)、实现、关联、聚合与组合
2.3 类图的表示方式
1)在UML类图中,类使用包含类名、属性(field) 和方法(method) 且带有分割线的矩形来表示,比如下图表示一个Employee类,它包含name,age和address这3个属性,以及work()方法。

2)属性/方法名称前加的加号和减号表示了这个属性/方法的可见性,UML类图中表示可见性的符号有三种:
- +:表示public
- -:表示private
- #:表示protected
3)属性的完整表示方式是: 可见性 属性名 :类型 [ = 缺省值 ]
4)方法的完整表示方式是: 可见性 方法名(参数列表) [ :返回类型 ]
- 也可以将类型放在变量名前面,返回值类型放在方法名前面
示例

上图Demo类定义了三个方法:
- method()方法:修饰符为public,没有参数,没有返回值。
- method1()方法:修饰符为private,没有参数,返回值类型为String。
- method2()方法:修饰符为protected,接收两个参数,第一个参数类型为int,第二个参数类型为String,返回值类型是int。
- method3()方法:权限修饰符为默认修饰符,返回值为void
2.4 类图-依赖关系(Dependence)
- 只要是在类中用到了对方,那么他们之间就存在依赖关系。如果没有对方,连编绎都通过不了。
- 在UML类图中,依赖关系使用带箭头的虚线来表示,箭头指向被依赖的类。
依赖关系示例代码:
| public class PersonServiceBean { private PersonDao personDao;//类 public void save(Person person){} public IDCard getIDCard(Integer personid){} public void modify() { Department department = new Department(); } } public class PersonDao{} public class IDCard{} public class Person{} public class Department{} |
以上代码对应的类图:

总结
- 类中用到了对方
- 是类的成员属性
- 是方法的返回类型
- 是方法接收的参数类型
- 方法中使用到
- 以上都是依赖。
2.5 类图-泛化关系(Generalization)
1)泛化关系实际上就是继承关系,它是依赖关系的特例
2)在 UML 类图中,泛化关系用带空心三角箭头的实线来表示,箭头从子类指向父类
泛化关系示例代码:
| public abstract class DaoSupport{ public void save(Object entity){ } public void delete(Object id){ } } public class PersonServiceBean extends Daosupport{ } |
以上代码对应类图:

2.6 类图-实现关系(Implementation)
1)实现关系是接口与实现类之间的关系,也是依赖关系的特例。
2)在 UML 类图中,实现关系使用带空心三角箭头的虚线来表示,箭头从实现类指向接口。
实现关系示例代码:
| public interface PersonService { public void delete(Interger id); } public class PersonServiceBean implements PersonService { public void delete(Interger id){} } |
以上关系对应类图如下:

2.7 类图-关联关系(Association)
1)关联关系是对象之间的一种引用关系,用于表示一类对象与另一类对象之间的联系,是依赖关系的特例
2)具有导航性:即双向关系或单向关系
3)具有多重性。主要有以下几种形式:
| 形式 | 含义 | 形式 | 含义 |
| 0 | 恰为0 | 1 | 恰为1 |
| 0..1 | 0或1 | 0..* | 任何数 |
| * | 任何数 | 1..* | 1或更多 |
- 单向一对一
| public class Person { private IDCard card; } public class IDCard{} |
- 双向一对一
| public class Person { private IDCard card; } public class IDCard{ private Person person } |
双向关联关系用一个不带箭头的实线表示。
-
自关联关系
| public class Employee { private Integer id; // 主键id private Integer leader; // 领导id } |
2.8 类图-聚合关系(Aggregation)
1)表示的是整体和部分的关系,整体与部分可以分开。
2)聚合关系是关联关系的特例,所以他具有关联关系的导航性与多重性。
3)在UML类图中,聚合关系可以用带空心菱形的实线来表示,菱形指向整体。
示例:如,一台电脑由键盘(keyboard)、显示器(monitor),鼠标等组成;组成电脑的各个配件是可以从电脑上分离出来的。
| public Computer { private Mouse mouse; private Monitor monitor; public void setMouse(Mouse mouse) { this.mouse = mouse; } public void setMonitor(Monitor monitor) { this.monitor = monitor; } } |
2.9 类图-组合关系(Composition)
1)也是整体与部分的关系,但是整体与部分不可以分开。
2)在UML类图中,组合关系用带实心菱形的实线来表示,菱形指向整体
3)再看一个案例:在程序中我们定义实体,Person、IDCard和Head,那么Head和Person就是组合,IDCard和Person就是聚合。
示例:Person与IDCard、Head, 那么 Head和Person就是组合,IDCard和Person就是聚合。但是如果在程序中Person实体中定义了对IDCard进行级联删除,即删除Person时连同IDCard一起删除,那么IDCard 和 Person 就是组合了
| public class Person{ private IDCard card; private Head head = new Head(); } public class IDCard{} public class Head{} |
2.10 组合关系 VS 聚合关系
1)组合关系是一种强关联关系,部分和整体具有同样的生命周期,即部分不能脱离整体单独存在,在整体消亡后,部分也会随之消亡。比如人和器官就是组合关系;国和家的关系也是组合关系,国没有了家也就没有了。
2)聚合关系是一种弱关联关系,部分和整体并没有相同的生命周期,整体消亡后部分可以独立存在。比如汽车(整体)与轮胎或发动机(部分)的关系,轮胎或发动机都可以脱离汽车而独立存在;再比如公司和员工的关系。
3)一般来说,组合关系中,被组合的对象是在组合对象创建的时候创建的,如上述组合关系代码中所看到的一样。
4)组合对象和被组合对象是一对一的关联关系;聚合关系则不同,被聚合的对象可以属于多个聚合对象,例如一个员工可以属于多个公司(全职和兼职)
相关文章索引
后记
我水平有限,错误难免,还望各位加以指正。
本文内容到此结束,感谢您的阅读!!!如果内容对你有帮助的话,记得给我三连丫(点赞、收藏、关注)
更多推荐
所有评论(0)