自行参考老师的建模工具
因为现在开发中大多数都是使用的IDEA,虽然视频中使用的是Eclipse, 但是我还是使用IDEA来写
在这个给大家推荐一个很好用的UML插件
https://www.yuque.com/jieshou-r0wj4/gtydap/me3gmz
安装直接参考链接安装就可以,我单独写了一篇,就不在这里再写了
这个插件功能非常强大,不止可以用来画类图和根据类直接解析成图还可以画
我们这里只说Class 类图
参考官网 类图符号
https://plantuml.com/zh/class-diagram
我这里只写一下关系符号
语法 | 描述 | 样式 |
---|---|---|
(--)代表直线(..)代表虚线 | 关系描述 | 图样式 |
A --|> B | 继承 | |
A ..|> B | 实现 | |
A ..> B | 依赖 | |
A --> B | 关联 | |
A --o B | 聚合 | |
A --* B | 组合 |
其他语法直接看上面的链接, 里面有详细写 语法
画图其实和写文章差不多,都是把自己的思想描述表达出来,关键是在于思路和条理
用例图 | use case |
---|---|
静态结构图 | 类图, 对象图, 包图, 组件图, 部署图 |
动态行为图 | 交互图(时序图与协作图), 状态图, 活动图 |
说明:
示例
代码形式
package com.dance.design.uml.demo;
public class Person {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
在这里教一个小技巧, 我们写完代码后不需要手动去画类图,可以直接使用PlantUML Parser解析出来
在类上点击
起一个名字点击生成,就可以得到类图了
是不是非常Nice
只要是在类中用到了对方, 那么他们之间就存在依赖关系,如果没有对方,编译都通不过
package com.dance.design.uml.dep;
public class PersonServiceBean {
private PersonDao personDao;
public void savePerson(Person person){}
public IDCard getIDCard(Integer personId){ return new IDCard(); }
public void modify(){
Department department = new Department();
}
}
class PersonDao{}
class IDCard{}
class Person{}
class Department{}
这个生成出来只有类图,没有依赖关系, 自己去写关系,通过上面说的符号,关系
我这里写一遍后面就直接贴图了
@startuml
class com.dance.design.uml.dep.PersonServiceBean {
- PersonDao personDao
+ void savePerson(Person)
+ IDCard getIDCard(Integer)
+ void modify()
}
class com.dance.design.uml.dep.PersonDao {
}
class com.dance.design.uml.dep.IDCard {
}
class com.dance.design.uml.dep.Person {
}
class com.dance.design.uml.dep.Department {
}
com.dance.design.uml.dep.PersonServiceBean ..> com.dance.design.uml.dep.PersonDao
com.dance.design.uml.dep.PersonServiceBean ..> com.dance.design.uml.dep.IDCard
com.dance.design.uml.dep.PersonServiceBean ..> com.dance.design.uml.dep.Person
com.dance.design.uml.dep.PersonServiceBean ..> com.dance.design.uml.dep.Department
@enduml
OK了
泛化其实就是继承, 是依赖关系的一种特殊情况
package com.dance.design.uml.ext;
public abstract class AbstractPerson {
public void save(){}
public void delete(){}
}
class Person extends AbstractPerson{
}
刚才在点击IDEA的时候发现IDEA其实默认是带了Diagrams这个类图插件的,这个也挺好用的直接就能显示,但是好像不能修改,但是可以控制方法,构造,接口这些是不是展示,感觉也挺好的, 有喜欢的可以去试试, 这里我们还是用PlantUML吧
哦~原来继承关系是可以自动解析出来的, 但是依赖就不行了
然后又回去看了看 Diagrams 发现居然可以展示依赖关系,上面有个小按钮, 还有组合关系居然也显示出来了, 而且也能编辑修改,突然感觉PlantUML不香了
而且还可以控制是否展示方法,啥的
emm, 我们还是以PlantUML来写吧, 工作中自然是哪个好用 用哪个(然后我在后面其实都贴了Diagrams的图)
就是A类实现了B接口, 其实也是依赖的一种特殊情况
package com.dance.design.uml.impl;
public interface PersonService {
void save();
}
class PersonServiceImpl implements PersonService{
@Override
public void save() {
System.out.println("实现");
}
}
没错, 我粘贴了Diagrams的图
但是突然发现两个一起使用会更好,如果是单个类文件的话,Diagrams会更好, 但是如果是包的话PlantUML会更好
有对比才有伤害
感觉PlantUML有点不好,就是在解析的时候不解析依赖关系, 其他的都很好,哎后面还是用PlantUML吧(渣男本难)
实现关系其实 没什么好说的,这个是在开发中最常用的 接口+impl
关联关系其实就是类与类之间的关联
常见的关联关系其实就是表设计时候的关系
关系 | 描述 |
---|---|
1 对 1 | 一个人 一张身份证 |
1 对 多 | 一个公司下好多部门 |
多 对 多 | 一个部门下好多人, 一个人又存在于多个部门 |
关联具有导航性, 就是方向 1 -> 1 是单向的 如果是 1 <-> 1就是双向的
关系具有多重性
package com.dance.design.uml.gl.onevone;
public class Person {
/**
* 身份证
*/
private IDCard idCard;
}
class IDCard{}
package com.dance.design.uml.gl.onevduo;
import java.util.List;
public class Gx {
/**
* 多部门
*/
private List<Department> departments;
}
class Department{}
package com.dance.design.uml.gl.duovduo;
import java.util.List;
public class Person {
private List<Department> departments;
}
class Department{
private List<Person> personList;
}
当然开发中不会这么写,一般都会用中间表,这里只是写样例
聚合关系表示的是整体和部分的关系, 整体和部分可以分开, 聚合关系是关联关系的特例, 所以他具有关联的导航性和多重性
一台电脑由键盘, 显示器, 鼠标等部件组成; 组成电脑的各个配件是可以从电脑上分离出来的, 使用实线-空心菱形表示
package com.dance.design.uml.gl.jh;
public class Computer {
public Mouse mouse;
public Keyword keyword;
public View view;
}
class Mouse{}
class Keyword{}
class View{}
组合关系: 也是整体与部分的关系, 但是整体和部分不可以分开
在我们看来, 台式机, 鼠标和键盘和显示器, 都是可以从主机上分离的, 所以他们是聚合关系, 但是如果是笔记本的话,显然自带键盘, 显示器都是不可分离的, 只有鼠标可以分离(触控板不可以), 这时显示器和电脑是组合关系,键盘和电脑是组合关系, 鼠标和电脑是聚合关系
package com.dance.design.uml.gl.jh;
public class Computer {
public Mouse mouse;
private Keyword keyword = new Keyword();
private View view = new View();
}
class Mouse{}
class Keyword{}
class View{}
组合采用实线-实心菱形表示