1、前言
相信很多同学在学习设计模式过程,会遇到各式各样的类图,且大家做法很一致看不懂,一律跳过类图,直接看代码。随着学习设计模式的深入,你会发现UML其实就是一个设计模式的灵魂,一个UML类图可以总结出设计模式理念思想,以及后续的代码,因此,今天让我们一起来学习UML,作为设计模式的入门
2、基础概念
UML(Unified Modeling Language,统一建模语言)是一种为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言,是非专利的第三代建模和规约语言。UML是面向对象设计的建模工具,独立于任何具体程序设计语言。
上面的定义是不是有点模糊,用个人的理解就是UML类图是通过图表的形式进行建模,将文字描述转变为图表的定义。就好像我们查看数据趋势的曲线图、柱状图等,光看数据很少能看出效果,转化为图表可以更加深刻的理解
3、类图的基本属性
3.1、UML类图的构成
下面我们通过一个Person类,来介绍下UML类图的属性
public class Person {
public String name;
private int age;
protected Double weight;
private int sex = 0;
public void setName(String name) { this.name = name; }
public String getName(){ return name; }
private String eat(String food){ return "吃" + food; }
protected int age(){ return age; }
}
所谓UML类图就是一个分成了三个格子的矩形,其中
-
第一个格子:表示类名/接口名
-
第二个格子:表示类的属性信息以及权限
- 具体格式为:权限 属性名:类型 [ = 默认值 ]
-
第三个格子:表示类的方法以及权限和返回信息
- 具体格式为:权限 方法名称(参数列表) [ : 返回类型]
-
其中权限常用的三个如下:
- +表示 public
- -表示 private
- #表示 protected
3.2、UML类图之间的关系
相信看到这里,大家对类图有了自己的认识,下面我们继续了解下UML类图的其他内容,类图之间的关系。
3.2.1、泛化关系(继承关系)
所谓的泛化(Generalization)关系,就是表示类与类之间的继承关系,接口与接口之间的继承关系,用空心三角形+实线表示,箭头指向父类
个人理解:继承就是一种是什么的关系,就像学生、老师都属于人这个范畴;人和鸟、兽都属于动物的范畴
代码体现:继承 extends
示例:
Student和Teacher继承父类Person
3.2.2、实现关系
所谓实现(Realization)关系,就跟我们在实际开发过程中的类与接口的实现关系一致,用空心三角形+虚线表示,箭头指向接口
个人理解:实现就是一种有什么的关系,像学生就拥有学习九年义务教育的权利,老师拥有国家的教师补贴的福利等
代码体现:接口实现 implements
示例:
这边我们假设存在一个接口(interface)IRight,用于定义一个right()方法,返回该用户拥有什么权利,然后Student和Teacher去实现这个接口
public interface IRight{
String right();
}
3.2.3、关联关系
所谓关联(Association)关系,更像一种拥有的关联关系,将两个独立的对象关联起来,一个类知道另一个类的属性和方法,用实线尖头表示
个人理解:就好像学生跟班主任是一种固定的关系,学生记录着班主任的信息,班主任有持有学生的名单
代码体现:一个类是另一个类的成员变量
示例:
对于学生来说学生依赖班主任,对于班主任来说班主任依赖学生,因为是双向关系可以直接用实线不带尖头表示
3.2.4、聚合关系
所谓聚合(Aggregation)关系,强调的是整体和部分的关系,既整体拥有部分(has-a),用空心菱形+实线尖头表示,菱形指向整体,尖头指向部分
个人理解:就好比我们人的穿着,我们的服饰有衣服、裤子、帽子等,这个服饰对于人来说可有可无,就算没有也不影响,既:人这个对象的生命周期和服饰这些对象的生命周期不同
代码体现:一个类是另一个类的成员变量
示例:
3.2.5、组合关系
所谓组合(Composition)关系,同样强调的是整合和部分的关系,但是更准确的说是整体包含部分(contains-a),用实心菱形+实线尖头表示,菱形指向整体,尖头指向部分
个人理解:就好比公司与部门的关系,没有公司就不存在部门,部门与公司共存,既:两者的生命周期是一致的
代码体现:一个类是另一个类的成员变量
示例:
3.2.6、依赖关系
所谓依赖(Dependence)关系,是一种较弱的关联关系,用虚线箭头表示,尖头指向别依赖方
个人理解:就像学生在参加某个讲座的时候需要使用入场证,使用完后,该证就不用了,下次参加讲座用的又是另一张入场证
代码体现:一个类是另一个类的局部变量、方法参数等
示例:
public class Certificate {
String name;
public Certificate(String name) {
this.name = name;
}
public Boolean entrance(){
return true;
}
}
public class Student {
private String name;
private int age;
// 方法参数
public Boolean entranceByCertificate(Certificate certificate){
if (certificate==null) {
return false;
}
return certificate.entrance();
}
}
从Student指向Certificate(被依赖方)
3.3、关系的强弱
相信看到这里大家对各种关系都有所认知了,关于关系的强弱,笔者其实不必过多阐述,通过阅读文章可知,文章依次往下的顺序刚好就是UML类图之间的强弱关系,既:
泛化关系 = 实现关系 > 关联关系 > 聚合关系 > 组合关系 > 依赖关系
这里存在分歧的是点是:
泛化关系 = 实现关系,应该改为 泛化关系 >= 实现关系,既从代码层面分析泛化(继承)有一点强于实现,这里笔者就不做过多的阐述,感兴趣的读者可以自行研究。