摘要:

在学习设计模式之前,你需要了解一下UML类图的基本知识,UML是Unified Model Language英文的首字母简写,称为统一建模语言。UML类图属于结构图,常用于一个系统的静态结构,包含类(Class)的UML图、接口(Interface)UML图以及泛化关系(Generalization)的UML图、关联关系(Association)的UML图、依赖关系(Dependency)的UML图和实现关系(Realization)的UML图,下面分别进行简单的介绍,首先看一下UML的合法,如下图:


一、类的UML图

在类的UML图中,使用一个长方形描述一个类的主要构成,将长方形垂直地分为三层。

第一层:表示类名,抽象类使用斜体字形,非抽象类使用常规字形。

第二层:表示属性,列出类的成员变量和类型,格式是“变量名字:类型”(如果一个类的变量很多,根据需要只列出重要的几个变量)。Public访问权限的变量,需要在变量名字前用“+”修饰;Protected访问权限的变量,需要在变量名字前用“#”修饰;Private访问权限的变量,需要在变量名字前用“-”修饰;如果变量的访问权限是友好的,不需要在变量名字前用任何的符号修饰。

第三层:表示方法,列出类的方法和返回类型,格式是“方法名字:类型”(如果一个类的方法很多,根据需要只列出重要的几个方法)。Public访问权限的方法,需要在方法名字前用“+”修饰;Protected访问权限的方法,需要在方法名字前用“#”修饰;Private访问权限的方法,需要在方法名字前用“-”修饰;如果方法的访问权限是友好的,不需要在方法名字前用任何的符号修饰;如果是静态方法,需要在方法名字下用“下划线”修饰。

在绘制类的UML图之前,TeachCourse先定义一个简单的类Student.java,该类包含常量SCHOOL,变量name,变量age,变量grade和方法information(),代码如下:

public class Student{
public String SCHOOL="北京大学";
protected String name;
private String age;
float grade;
public String information(){
return name+"来自"+SCHOOL;
}
...
}

类的UML类图:


二、接口的UML图

表示接口(Interface)的UML图和表示类(Class)的UML图类似,使用一个长方形描述一个接口的主要构成,将长方形垂直分为三层。

第一层:表示接口名,使用斜体字形,而且需要用《Interface》修饰接口名,并且该修饰和名字分列在两行。

第二层:表示常量层,列出接口中的常量及类型,格式是“常量名字:类型”。在Java中,接口的中的常量访问权限都是public的,需要在常量名字前用“+”修饰。

第三层:表示方法层,列出接口中的方法及返回类型,格式是“方法名字:类型”。在Java中,接口的中的方法访问权限都是public的,需要在方法名字前用“+”修饰。

在绘制接口的UML图之前,TeachCourse先简单定义一个接口OnClickListener.java,接口中包含常量STATE,方法onClick(),代码如下:

public interface OnClickListener{
public int STATE=0;
public void onClick();
}

接口的UML图:


三、泛化关系的UML图

对于面向对象语言,UML中所说的泛化关系就是指类的继承关系。如果一个类是另一个类的子类,通过使用一个实线连接两个类的UML图来表示两者之间的继承关系,实线的起始端是子类的UML图,终点端是父类的UML图,但终端使用一个空心的三角形表示实线的结束。

在绘制泛化关系的UML图之前,TeachCourse先简单定义一个子类StudentA.java,继承上文的Student,在子类中定义变量birthday和方法skill(),代码如下:

public class StudentA extends Student{
private String birthday;
public void skill(){
System.out.println("擅长打篮球。。。");
}
}

泛化关系的UML图:


四、关联关系的UML图

如果A类中成员变量是用B类(接口)来声明的变量,那么A和B的关系是关联关系(Association),称A关联于B。如果A关联于B,那么UML通过使用一个实线连A和B的UML图,实线的起始端是A的UML图,终点端是B的UML图,但终点端使用一个指向B的UML图的方向箭头表示实线的结束。

在绘制关联关系的UML图之前,TeachCourse先简单定义一个类Button.java,定义成员变量OnClickListener,成员变量Student,成员方法getText(),其中OnClickListener是上文定义的接口,Student是上文定义的类,代码如下:

public class Button{
public OnClickListener onClickListener;
private String content;
Student Student;
public void getText(){
System.out.println("获取按钮是的文本内容。。。");
}
}

关联关系的UML图:


五、依赖关系的UML图

如果A类中某个方法的参数用B类(接口)来声明的变量或某个方法返回的数据类型是B类型,那么A和B的关系是依赖关系(Dependency),称为A依赖于B。如果A依赖于B,那么UML通过使用一个虚线连A和B的UML图,虚线的起始端是A的UML图,终点端是B的UML图,但终点端使用一个指向B的UML图的方向箭头表示虚线的结束。

在绘制依赖关系的UML图之前,TeachCourse先简单定义一个类TextView.java,声明成员方法displayInfo(Student stu),传入Student对象,其中Student为上文定义的类,代码如下:

public class TextView{
private OnClickListener onClickListener;
public Student displayInfo(String name,float grade){
return new Student(name,grade);
}
public void setOnClickListener(OnClickListener onClickListener){
this.onClickListener=onClickLitener;
}
}

依赖关系的UML图:


六、 实现关系的UML图

如果一个类实现了一个接口,那么类和接口就是实现关系(Realization),称类实现接口。UML通过使用虚线连接类和它所实现的接口,虚线起始端是类,虚线终点端是接口,但终点使用一个指向接口的空心三角形表示虚线的结束。

在绘制实现关系的UML图之前,TeachCourse先简单定义一个类OnClickListenerImpl.java,其中OnClickListenerImpl实现上文的OnClickListener接口,代码如下:

public class OnClickListener implement OnClickListener{
@Override
public void onClick(){
System.out.println("类实现接口。。。");
}
}

依赖关系的UML图:


七、注释

UML使用注释(Annotation)为类图提供附加的说明。UML类图在一个带卷角的长方形中显示给出的注释,并使用虚线将这个带卷角的长方形和它所注释的实体连接起来。

在绘制注释图形之前,TeachCourse首先确定想要给Student.java类的UML图的information()方法添加注释,如下图:


总结:

到此,我们已经简单地介绍完类的UML图、接口的UML图、泛化关系的UML图、关联关系的UML图、依赖关系的UML图和实现关系的UML图,重点在于理解每一种UML图的定义和表示方法,总结如下:

类的UML图分为抽象类和非抽象类,抽象类名使用斜体字形;

接口的UML图,接口名使用斜体字形,同时使用《Interface》符号修饰;

泛化关系的UML图使用实线空心箭头表示;

关联关系的UML图使用实线箭头表示;

依赖关系的UML图使用虚线箭头表示;

实现关系的UML图使用虚线空心箭头表示。