UML类图是学习设计模式之前必会必学的知识点,学习设计模式会涉及到大量的类结构,写这篇文章的同时也是在记录自己在学习设计模式的过程中遇到的一些问题,大家来一起参考一下吧。
首先看一下类图概念,简单来说就是更加直观的看一个类的结构,按照国际惯例类图就是采用UML的方式表示。
类图(Class diagram)是显示了模型的静态结构,特别是模型中存在的类、类的内部结构以及它们与其他类的关系等。类图不显示暂时性的信息。类图是面向对象建模的主要组成部分。它既用于应用程序的系统分类的一般概念建模,也用于详细建模,将模型转换成编程代码。
下面引用一个常用UML类图图示样例:
基本概念:
矩形框代表一个类的结构(Class),类图分为三层:
第一层代表类名,若是抽象类类名用斜体表示。
第二层代表特性,也就是字段或者属性。
第三层代表操作,也就是方法或行为。
其中,符号表示访问权限:‘ ’表示public,‘-’表示private,‘#’表示protected。类与类之间的符号代表两个类的关系。
类之间的关系:
类与类一共有如下几种关系:继承(Generalization)、实现(Realization)、依赖(Dependence)、关联(Association)、聚合(Aggregation)、组合(Composition)。
1、继承关系
继承关系中,子类继承父类的所有特征和行为。看到类图中的动物类和鸟类,鸟类是一种动物,两者是继承的关系。UML类图表示如下:
继承关系例图
继承关系用三角形 实线表示,方向从子类指向父类。
在Java语言中,extends关键字代表继承,简单得按照这个类图写一下代码吧:
代码语言:javascript复制public class Animal {
public int lives;
public void breeding(){
if (lives > 0){
System.out.println("我要繁殖啦~");
}
}
}
代码语言:javascript复制public class Bird extends Animal {
public String feather;
public void layEggs(){
System.out.println("下蛋方法");
}
}
2、实现关系
实现是类与接口的一种关系,类实现接口的所有特征与行为。看到大雁类和飞翔接口的位置,接口有interface标识,它们之间的是实现关系,类必须实现接口中的所有方法。因此大雁类具有"飞()"方法。类图如下:
实现关系例图
实现关系用三角形 虚线表示,方向从类指向接口。
implements关键字代表实现,简简单单过一下代码:
代码语言:javascript复制public class Oxygen {
@Override
public String toString() {
return "氧气浓度:21%";
}
}
代码语言:javascript复制public class Water {
@Override
public String toString() {
return "100ml的水";
}
}
代码语言:javascript复制public class Animal {
public int lives;
public void breeding() {
if (lives > 0) {
System.out.println("我要繁殖啦~");
}
}
//新方法,新陈代谢
public void metabolism(Oxygen o, Water w) {
System.out.println("新陈代谢需要" o.toString() "和" w.toString());
}
}
3、依赖关系
依赖关系是一种弱的使用的关系, 即一个类的实现需要另一个类的协助。在类图中,动物依赖于水和空气才能生存,这是依赖关系的一个例子,类图表示如下:
依赖关系例图
依赖关系用箭头 虚线表示,方向从依赖类指向被依赖类。
代码体现在局部变量、方法的参数或者对静态方法的调用中。补充一下刚才动物类的方法:
代码语言:javascript复制public class Oxygen {
@Override
public String toString() {
return "氧气浓度:21%";
}
}
代码语言:javascript复制public class Water {
@Override
public String toString() {
return "100ml的水";
}
}
代码语言:javascript复制public class Animal {
public int lives;
public void breeding() {
if (lives > 0) {
System.out.println("我要繁殖啦~");
}
}
//新方法,新陈代谢
public void metabolism(Oxygen o, Water w) {
System.out.println("新陈代谢需要" o.toString() "和" w.toString());
}
}
4、关联关系
关联关系比较常见,是一种强的、稳定的、持久的关系, 它使一个类知道另一个类的属性和方法。例子中表示为企鹅‘知道’气候的变化。
关联关系例图
关联关系用箭头 实线表示。方向从关联类指向被关联类。
代码体现在成员变量中,继续写一下代码吧:
代码语言:javascript复制public class Climate {
}
代码语言:javascript复制public class Penguin extends Bird{
private Climate climate;
}
5、聚合关系
聚合关系表示部分与整体的一种弱的拥有关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分。根据图例就可以理解为雁群包含了每一只大雁,但大雁离开雁群还是可以独立存在的,所以大雁不是雁群的一部分。
聚合关系例图
聚合关系用空心菱形 实线箭头表示,菱形顶端为整体。
代码体现在成员变量中,继续撸一下代码,简单写了下逻辑:
代码语言:javascript复制public class WideGooseAggregate {
private WildGoose[] arrayWideGoose = new WildGoose[3];
public WideGooseAggregate(){
arrayWideGoose[0] = new WildGoose();
arrayWideGoose[1] = new WildGoose();
arrayWideGoose[2] = new WildGoose();
}
public void vFly() {
System.out.println("V型飞行");
for (WildGoose wGoose : arrayWideGoose) {
wGoose.flyaway();
}
}
public void hFly() {
System.out.println("一型飞行");
for (WildGoose wGoose : arrayWideGoose) {
wGoose.flyaway();
}
}
}
6、组合关系
组合关系表示部分与整体的一种强的拥有关系,体现为严格的部分和整体关系,部分和整体的生命周期一样。根据例子,翅膀与鸟就是组合的关系。翅膀是鸟的一部分,翅膀脱离了鸟就不能独立存在。
组合关系例图
组合关系用实心菱形 实线箭头表示,菱形顶端为整体。
代码体现在成员变量中,再改一下刚才鸟类的代码吧:
代码语言:javascript复制public class Bird extends Animal {
public String feather;
private Wings wings; //翅膀
public Bird(){
//翅膀与鸟的生命周期一样
wings = new Wings();
}
public void layEggs(){
System.out.println("下蛋方法");
}
}
总结
在理解性记忆的同时,允许我再啰嗦一下:
继承:三角形 实线
实现:三角形 虚线
依赖:箭头 虚线
关联:箭头 实线
聚合:空心菱形 实线箭头
组合:实心菱形 实线箭头