在理解设计模式之前,首先要能看懂类图的含义,其实UML类图非常简单,一共就6种关系,以下来总结各种关系的含义,对应的图怎么画
泛化(继承)
在面向对象的语言中,继承是一大特点,无论是普通类继承普通类,普通类继承抽象类,抽象类继承抽象类,接口继承接口,都称为泛化关系。
其在类图中的画法为:子类通过 实线,空心箭头 指向父类
实现
类对接口的实现
其在类图中的画法为:接口通过 虚线,空心箭头 指向实现类
关联
A类是B类的成员变量,则称A与B为关联关系
- 单向关联
B是A的成员变量,则A类单向关联B类
画法为A类通过 实线,箭头
指向类 - 双向关联
A类与B类互为成员变量,则A与B双向关联
画法为:A类与B类通过 实线 连接 - 自关联
A类的成员变量中有A类本身,称为自关联
画法:A类通过 实心,箭头 指向它自己 - 组合与聚合
组合与聚合是一种特殊的关联方式,其本质也是A持有B类的成员变量,组合和聚合的区别,在于A类持有B类实例的时机不同,由于组合与聚合使用较多,在下文单独描述。
组合
A类的成员变量中包含B类,且当在A类初始化的时候就获取到了B类的实例,则该关系称为组合
代码中,可以是在定义成员变量的时候直接赋值,也可以在类的构造器中初始化
//法1 定义成员变量时直接赋值
class A {
B b = new B();
}
class B{
}
//法2 在构造器中初始化
class A {
public B b;
A(B b){
this.b = b;
}
}
class B{
}
画法:A类通过 实心菱形,实线 指向B类
聚合
A类的成员变量中包含B类,且A类在系统运行中才获取到B类实例,则该关系称为聚合
代码中,在A类的set函数中获取B类实例
//法1 定义成员变量时直接赋值
class A {
B b;
public void setB(B b){
this.b = b;
}
}
class B{
}
画法:A类通过 空心菱形,实线 指向B类
依赖
以下三种情况称为A类依赖B类:
- A类方法中,B类作为参数
class A {
public f1(B b){
//使用B类,完成一些功能
}
}
class B{
}
- A类方法中,B类作为局部变量
class A {
public f1(B b){
B b = new B();
//使用B类,完成一些功能
}
}
class B{
}
- A类方法中,使用到B类的静态方法
class A {
public f1(B b){
B.f2();
}
}
class B{
public static f2(){
}
}
画法为:A 类通过 虚线,箭头 指向B类