搞!UML类图
Posted 编程技术进阶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了搞!UML类图相关的知识,希望对你有一定的参考价值。
重磅干货,第一时间送达
哈哈,同样是最近参加了一个新项目,除了 SPI,还有要看的类图也多了,嘻嘻,同样是一个小总结。这里采用代码+图的方式方便理解,差不多跟着用 ProcessOn 或者 Visio、draw.io 这类工具画一下就基本掌握了。
作为小开发一枚,类图是经常遇到的,所以下面直接上来自百度百科的 类图 解释:
类图(Class diagram)是显示了模型的静态结构,特别是模型中存在的类、类的内部结构以及它们与其他类的关系等。类图不显示暂时性的信息。类图是面向对象建模的主要组成部分。它既用于应用程序的系统分类的一般概念建模,也用于详细建模,将模型转换成编程代码。类图也可用于数据建模。
1、类图的表示
直入主题,上图上码!
1.1、普通类 class
代码:
public class Person {
/** 用 - 号表示 private */
private String name;
/** 用 + 号表示 public */
public String id;
/** 用 # 表示 protected */
protected Integer sex;
/** 没有这表示是 Default */
Integer age;
public void setName(String name){
this.name = name;
}
public String getName() {
return name;
}
}
普通类图:上面的是成员变量、下面的是成员方法
+-# :类图的前缀的几个符号,看代码的解析
1.1、接口类 interface
代码
public interface Human {
/** 接口中的成员变量必须是 public static final 的 */
String NAME = "人类";
/** 方法默认是 public 的 */
void work();
void eat();
}
接口类的类名上面有 <<interface>> 表示这是一个接口
1.3、抽象类 abstract class
代码
public abstract class Programmer implements Human {
private String language;
@Override
public void work() {
System.out.println("程序员的工作:全干工程师");
}
abstract String getLanguage();
}
抽象类的类名和抽象方法用斜体
1.4、枚举 Enum
代码
public enum EnumTest {
INSTANCE {
@Override
String getSay() {
return "嘻嘻,Enum 实现的单例就是这样的搞得";
}
};
public void say(){
System.out.println(getSay());
}
abstract String getSay();
}
枚举的类名上面有个 << Enum>> 表示这是一个枚举
2、UML 类图中的关系表示
2.1、依赖关系
只是在类的成员方法中使用了,没有用作成员变量。用虚线的箭头表示
A的形参、局部变量、返回值、调用静态方法,则表示对 B 形成依赖。
public cLass Company {
/**形参形成依赖*/
public void test (XiaoMing xiaoMing){
//局部变量也形成了依赖
XiaoMing xiaoMing1 = new XiaoMing();
//静态方法调用也形成了依赖
XiaoMing. test();
}
/**返回值也构成依赖*/
public XiaoMing getXiaoMing(){
return new XiaoMing();
}
}
图示,Compny 依赖 XiaoMing,用虚线箭头
2.2、关联关系
和依赖关系不同的是,关联关系有作为成员变量,这样耦合度更高,用的是实线箭头:
代码:
public class Company {
/** 和依赖不同的是: 关联表示 XiaoMing 是 Company 的成员变量
* A 依赖 B,仅仅是A在某个方法的形参、方法返回值、方法内的局部变量使用了 B
**/
XiaoMing ming;
}
图示:Company 关联 XiaoMing,用实线箭头
关联关系之自身关联
代码:
public class ListNode {
public ListNode next;
}
自己关联自己
双向关联
代码:
public class ClassA{
private ClassB classB;
}
public class ClassB{
private ClassA classA;
}
图示,箭头没了
2.3、聚合关系
聚合关系和下面的组合关系都是一种特殊的关联关系,区别在于组合的耦合度更高。
大雁群由大雁组成,所以大雁是大雁群的成员变量,所以是一种关联的关系。但大雁群必须要有大雁,这也是为什么说是一种特殊的关联关系。
但大雁不会因为离开了大雁群就无法独立存在了,大雁群不会因为某个大雁的离开就直接解散了。
同样的公司(聚合对象)和员工(被聚合对象),员工离开当前公司一样活得好好的,公司也不会因为某个员工的离职而直接倒闭(除非是最后一个员工离职)。
这里的代码用班主任和班级举例,老师不会因为不当班级主任就无法教书了,班级可以换班主任。
代码:
public cLass Teacher{}
public cLass Classes {
/**班主任*/
private Teacher headTeacher;
public Classes(Teacher teacher){
this .headTeacher = teacher;
}
}
图示,Classes 是聚合类,Teacher 是被聚合类,空心菱形在聚合类上。被聚合对象和聚合对象有着各自的生命周期
2.4、组合关系:
组合关系和聚合关系对比:
-
聚合关系:被聚合对象和聚合对象有着各自的生命周期 -
组合关系:包含对象负责被包含对象的创建和生命周期,也就是包含对象被销毁了,被包含的对象也会被销毁
组合关系举例:
-
人和心脏:人(包含对象)去世了心脏(被包含对象)也就跟着去世了 -
汽车和轮胎:汽车(包含对象)报销了轮胎(被包含对象)也跟着报销了
不要说轮胎可以换到其他车上去,这里举例是为了方便理解。
组合关系和聚合关系在代码上的区别是:
-
聚合关系:被聚合对象是外部创建传入到聚合对象 -
组合关系:被包含对象是在包含对象中创建的(通过成员变量的初始化、构造函数的初始化等)
public class Heart {
}
public class People {
/** 心脏 */
private Heart heart;
public People(){
// 这里是构造函数的初始化
this.heart = new Heart();
}
}
图示:People 是包含对象,Heart 是被包含对象,实心的菱形在包含对象的一侧:
2.5、泛化关系
超好理解,extends 就是啦
public class XiaoMing extends Programmer{
@Override
public void eat() {
System.out.println("小明喜欢番茄炒蛋");
}
@Override
public String getLanguage() {
System.out.println("小明使用 Java");
return "Java";
}
public static void test(){}
}
图示:用空心三角和实线
2.5、实现关系
也超好理解,implements 就是啦
public abstract class Programmer implements Human {
private String language;
@Override
public void work() {
System.out.println("程序员的工作:全干工程师");
}
abstract String getLanguage();
}
图示:用空心三角和虚线表示
UML 类图的思维导图
以上是关于搞!UML类图的主要内容,如果未能解决你的问题,请参考以下文章