文章目录:
1.UML基本介绍
1. UML——Unified modeling language UML (统一建模语言),是一种用于软件系统分析和设计的语言工具,它用于帮助软件开发人员进行思考和记录思路的结果。
2. UML本身是一套符号的规定,就像数学符号和化学符号一样,这些符号用于描述软件模型中的各个元素和他们之间的关系,比如类、接口、实现、泛化、依赖、组合、聚合等,如下图:
上面的截图就是一个UML类图的案例,只不过这是在eclipse中的,下面的类图我会在IDEA中使用。
画UML图与写文章差不多,都是把自己的思想描述给别人看,关键在于思路和条理,UML图分类:👇👇👇
1. 用例图 (use case)
2. 静态结构图: 类图、对象图、包图、组件图、部署图
3. 动态行为图: 交互图(时序图与协作图)、状态图、活动图
类图是描述类与类之间的关系的,是UML图中最核心的。
2.UML类图
用于描述系统中的类(对象)本身的组成和类(对象)之间的各种静态关系。
类之间的关系: 依赖、泛化(继承)、实现、关联、聚合与组合。
2.1 类关系——依赖
只要是在类中用到了对方,那么他们之间就存在依赖关系。 来看下面的代码
package com.szh.uml.dependence; public class PersonServiceBean { private PersonDao personDao; public void save(Person person) { } public IDCard getIDCard(Integer personId) { return null; } public void modify() { Department department = new Department(); } }
package com.szh.uml.dependence; public class PersonDao { }
package com.szh.uml.dependence; public class Person { }
package com.szh.uml.dependence; public class IDCard { }
package com.szh.uml.dependence; public class Department { }
上面的代码中,PersonServiceBean类中用到了Department、Person等这几个类,那么我们就可以说PersonServiceBean类与它们几个类之间存在依赖关系。
1. 类中用到了对方
2. 类的成员属性
3. 方法的返回类型
4. 方法接收的参数类型
5. 方法体内部使用到
依赖的符号就是虚线 + 一个箭头。
2.2 类关系——泛化
泛化实际上就是继承,它是依赖关系的一种特例。
如果A类继承了B类,那么我们就可以说 A和B 之间存在泛化关系。
package com.szh.uml.generalization; public abstract class DaoSupport { public void save(Object entity) { } public void delete(Object id) { } }
package com.szh.uml.generalization; public class PersonServiceBean extends DaoSupport { }
继承就不再多说了,这里需要指出的一点是:IDEA中的泛化符号不太一样,一般来说,泛化的符号应该是实线 + 一个空心三角形,而IDEA中则是下图这样。
2.3 类关系——实现
实现关系其实就是面向接口而言,它和泛化一样,也是依赖关系的一种特例。
如果A类实现了接口B,那么我们就可以说A和B之间存在实现关系。
package com.szh.uml.implementation; public interface PersonService { public void delete(Integer id); }
package com.szh.uml.implementation; public class PersonServiceBean implements PersonService{ @Override public void delete(Integer id) { System.out.println("delete.."); } }
实现接口这个也不再多说了。这里需要指出的一点是:IDEA中的实现符号不太一样,一般来说,实现的符号应该是虚线 + 一个空心三角形,而IDEA中则是下图这样。
2.4 类关系——关联
关联关系实际上就是类与类之间的联系,他是依赖关系的特例。关联具有导航性: 即双向关系或单向关系。
关系具有多重性: 如“1”(表示有且仅有一个),“0...”(表示0个或者多个),“0,1”(表示0个或者一个),“n.….m”(表示n到 m个都可以), "m.….*”(表示至少m个)
package com.szh.uml.association1; /** * */ public class Person { private IDCard card; }
package com.szh.uml.association1; /** * */ public class IDCard { }
这里我们的理解就是Person类表示人,IDCard类表示身份证类,一个人只有一个身份证号、一个身份证号只属于一个人,所以它俩之间就存在着一对一的关联关系。 关联的符号就是实线 + 一个箭头。
下图是单向的关联关系,当我们在IDCard类中声明了Person类的成员变量时,这二者之间的关联关系就转换成了双向。(图中还有组合符号,我们后面会说)
2.5 类关系——聚合
聚合关系(Aggregation)表示的是整体和部分的关系,整体与部分可以分开。聚合关系是关联关系的特例,所以他具有关联的导航性与多重性。
如: 一台电脑由键盘(keyboard)、显示器(monitor),鼠标等组成;组成电脑的各个配件是可以从电脑上分离出来的,使用带空心菱形的实线来表示。
package com.szh.uml.aggregation; public class Computer { private Mouse mouse; private Monitor monitor; public void setMouse(Mouse mouse) { this.mouse = mouse; } public void setMonitor(Monitor monitor) { this.monitor = monitor; } }
package com.szh.uml.aggregation; public class Monitor { }
package com.szh.uml.aggregation; public class Mouse { }
聚合的符号一般来说应该是实线 + 空心菱形,组合的符号则是实线 + 实心菱形,IDEA中聚合、组合的符号都是下图这样。
2.6 类关系——组合
组合关系: 也是整体与部分的关系,但是整体与部分不可以分开。
再看一个案例:在程序中我们定义实体: Person与IDCard、Head,那么 Head和 Person 就是组合, IDCard 和Person就是聚合。
但是如果在程序中 Person实体中定义了对IDCard进行级联删除,即删除Person时连同IDCard 一起删除,那么IDCard和 Person就是组合了。
package com.szh.uml.composition; public class Computer { private Mouse mouse = new Mouse(); private Monitor monitor = new Monitor(); public void setMouse(Mouse mouse) { this.mouse = mouse; } public void setMonitor(Monitor monitor) { this.monitor = monitor; } }
package com.szh.uml.composition; public class Monitor { }
package com.szh.uml.composition; public class Mouse { }
package com.szh.uml.composition; public class Person { private IDCard card; private Head head = new Head(); }
package com.szh.uml.composition; public class Head { }
package com.szh.uml.composition; public class IDCard { }