UML(
Unified Modeling Language) 统一建模语言,
它是一个支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段提供模型化和可视化支持,包括由需求分析到规格,到构造和配置。
UML类图分为三个部分,最上面部分是类的类名,中间部分是类属性的,最小面部分是类的方法,其中属性和方法分别使用"
+”、“#”、“-” 分别表示public、protected、private。
UML图中经常用到的类与类之间的关系: 依赖,关联,泛化,聚合,组合,实现;(具体的关系可以通过类的实现来概括)
一 依赖:
如果A类的变化引起的B类的变化,则称B类依赖于A类
依赖关系(Dependency) 是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系。
大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数。
UML图中,
依赖关系使用带箭头的虚线表示, 由依赖的一方指向被依赖的另一方。
![](https://i-blog.csdnimg.cn/blog_migrate/faa825eaad8a28e94016051b4f321cfa.png)
1 public class Driver 2 { 3 public void drive(Car car) 4 { 5 car.move(); 6 } 7 …… 8 } 9 public class Car 10 { 11 public void move() 12 { 13 ...... 14 } 15 …… 16 }
二 关联:
关联(
Association
)关系
是一种拥有的关系,可以是一对多的拥有,如:篮球队和篮球运动员的关联关系(每个球员都有自己所属的球队,每个球队都有自己的球员),
也可以是一对一的关联关系如 妻子与丈夫的关系; 另外关联关系还可以是单项的关联,如购物用户和用户收货地址。
关联关系与依赖关系的区别:
关联关系属于类与类之间的联接,Java语言中关联关系一般使用成员变量来实现
,即一个类在另一个类中是成员变量。
而依赖关系中,被
依赖类并不出现在依赖类的成员变量中,而只是以传参的方式传入到依赖类中某些方法中,在Java语言中体现为局部变量,方法的形参等。
在UML类图中,
使用实线连接有关联的对象所对应的类
,如果是单向关联关系则使用带箭头的实线,如果是双向关联关系就使用无箭头的实线
![](https://i-blog.csdnimg.cn/blog_migrate/b84bc8974a5e746fc8e3bd16492251de.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f729eacebbf4223533934d637fe86a6b.png)
双向关联 单向关联
// 双向关联
1 public class Team { 2 private String name; 3 private String address; 4 5 private Player[] players; 6 } 7 8 public class Player { 9 private String name; 10 private Team team; 11 12 }
// 单向关联
1 public class Customer 2 { 3 private Address address; 4 …… 5 } 6 7 public class Address 8 { 9 …… 10 }
另外还有一种自关联的关系,表现为自身类被定义为自己的一个属性
![](https://i-blog.csdnimg.cn/blog_migrate/17d470278eb49828310b1c6ac931b247.png)
代码实现:
1 public class Node { 2 3 private Node node; 4 5 }
三 泛化(继承):
若
A是B和C的父类,B,C具有公共类(父类)A,说明A是B,C的一般化(概括,也称泛化)
泛化关系
也就是继承关系,也称为“is-a-kind-of”关系,泛化关系用于描述父类与子类之间的关系,父类又称作基类或超类,子类又称作派生类。
在UML中,泛化(继承)关系使用带空心三角形的实线来表示
![](https://i-blog.csdnimg.cn/blog_migrate/26b6348be208f5947dd32d796bce51d6.png)
1 public class Person 2 { 3 protected String name; 4 protected int age; 5 public void move() 6 { 7 …… 8 } 9 public void say() 10 { 11 …… 12 } 13 } 14 public class Student extends Person 15 { 16 private String studentNo; 17 public void study() 18 { 19 …… 20 } 21 }
四 实现:
实现关系(Implementation):
是用来规定接口和实线接口的类或者构建结构的关系,接口是操作的集合,而这些操作就用于规定类或者构建的一种服务
在UML中,类与接口之间的实现关系
使用带空心三角形的虚线来表示
。
![](https://i-blog.csdnimg.cn/blog_migrate/d5a831321980e57c436b4f69545171b5.png)
1 public interface Vehicle 2 { 3 public void move(); 4 } 5 public class Ship implements Vehicle 6 { 7 public void move() 8 { 9 …… 10 } 11 } 12 public class Car implements Vehicle 13 { 14 public void move() 15 { 16 …… 17 } 18 }
五 聚合:
聚合属于关联关系的一种(是一种 has-a 的关系):聚合是整体与部分之间的关系,与关联关系不同的是,关联关系涉及的两个类是处于相同层级的,而聚合关系中一个是整体另一个是部分。
从代码层面来分析的话,聚合和关联关系是一致的,从语义层面来看的话,聚合关系中的两个类是存在一个(整体)包含另一个(部分)的关系的,这种一个包含另一个(也可以不包含)的关联关系就是聚合关系。
聚合关系中整体对部分的这种可包含可不包含的关联体现在, 整体生命周期结束了,部分依然可以继续存在,譬如汽车坏掉了不工作了,把引擎取出来放到另一辆车上仍可以继续工作。
聚合关系使用空心的菱形+箭头和实线来表示
,菱形指向整体,箭头指向部分。
![](https://i-blog.csdnimg.cn/blog_migrate/a6f16f7b872c987f93ff76d6df1712a3.png)
1 public class Car 2 { 3 private Engine engine; 4 public Car(Engine engine) 5 { 6 this.engine = engine; 7 } 8 9 public void setEngine(Engine engine) 10 { 11 this.engine = engine; 12 } 13 …… 14 } 15 public class Engine 16 { 17 …… 18 }
六 组合:
组合也
属于关联关系的一种:组合关系体现的是一种contains-a 的关系,同样的组合关系中双方也是一个是整体,一个是部分,但是组合关系中整体和部分是不可分离的
意味着如果整体的生命周期结束,则部分的生命周期也会结束。光是从代码层面也是不能区分这种关联关系是否是组合关系,需要从语义层面分析。
UML图中, 组合关系
使用 实心的菱形 + 箭头 以及实线来表示
,实心菱形指向整体,箭头指向部分。
![](https://i-blog.csdnimg.cn/blog_migrate/ed783b04ac8952bb8810d685bd5a727f.png)
1 public class Head 2 { 3 private Mouth mouth; 4 public Head() 5 { 6 mouth = new Mouth(); 7 } 8 …… 9 } 10 11 public class Mouth 12 { 13 …… 14 }
依赖 --> 关联 --> 聚合 --> 组合 集中关系中类与类之间的耦合关系逐步增强(即一个类发生变化另一个类收到的影响程度逐步增强)。
参考: