在我们程序开发中都离不开类的概念,平时我们说的类应该怎么描述呢?有一款工具叫做UML(Unified Modeling Language)又称统一建模语言,类图是使用频率最高的UML图之一!它具体有什么用处呢?它能够脱离语言的限制,抽象地描述各个类的信息及各个类之间的关系,下面我们来具体学习UML的基本用法!

一、类的基本表示方式

在UML类图中,一个矩形表示一个类,矩形中有类名、属性和方法!下图是一个person的类

将下面类图转换成相应java代码 根据类图编写代码_uml

对应的ts代码

class person{
       private name:string;
       private age:number;
       walk(){
           //.....
       }
   };

es6写法

class Person {
      #name;
      #age;
      walk() {
          //.....
      }
  }

es5模拟代码

function Person(){
     var name,age;
     Person.prototype.walk=function(){
         //....
     }
 }
1.UML类图中表示可见性的符号有三种:
  1. +:表示public
  2. -:表示private
  3. #:表示protected
2.属性的完整表示:

可见性 名称 :类型 [ = 缺省值]
[ ]的内容表示是可选的,例如(-name:string =‘zhangsan’),private属性name,值为"zhangsan"!

3.方法的完整表示

可见性 名称(参数列表) [ : 返回类型]
[ ]的内容表示是可选的,例如(+walk() : string),public方法walk无参数,返回值类型为String!

3.类图的组成部分
  1. 第一部分为类名,如果类名用正体书写则说明这是可以实例化的普通类。如果类名用斜体书写,则说明这是抽象类。如果类名有下划线修饰则说明这是静态类。
  2. 第二部分为类内的属性,格式为修饰符 属性名 :属性类型。修饰符为“+”说明该属性为public型,“#”说明该属性为protected型,“-”说明该属性为private型。
  3. 第三部分为类内的方法,格式为修饰符 方法名 (参数名1:参数类型1,……):方法返回值类型。修饰符为“+”说明该方法为public型,“#”说明该方法为protected型,“-”说明该方法为private型。如果方法名有下划线修饰则说明这是静态方法。
二、类之间关系的表示方式
1.继承关系(泛化关系Generalization)

泛化关系是对象之间耦合度最大的一种关系,表示一般与特殊的关系,是父类与子类之间的关系,是一种继承关系,在 UML 类图中,泛化关系用带空心三角箭头的实线来表示,箭头从子类指向父类。在代码实现时,使用面向对象的继承机制来实现泛化关系。例如,Student 类和 Teacher 类都是 Person 类的子类,看下图:

将下面类图转换成相应java代码 根据类图编写代码_uml_02

2.依赖关系(Dependency)

依赖表示一个事物使用另一个事物时使用依赖关系。大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数。在代码中,某个类的方法通过局部变量、方法的参数或者对静态方法的调用来访问另一个类(被依赖类)中的某些方法来完成一些职责。在 UML 类图中,依赖关系使用带箭头的虚线来表示,箭头从使用类指向被依赖的类。下面 所示是人与car的关系图,人通过car才能开车驾驶。

将下面类图转换成相应java代码 根据类图编写代码_UML_03

3.关联关系(Association)

关联关系是对象之间的一种引用关系,用于表示一类对象与另一类对象之间的联系,如老师和学生、师傅和徒弟、丈夫和妻子等。关联关系是类与类之间最常用的一种关系,分为一般关联关系、聚合关系和组合关系。我们先介绍一般关联。关联可以是双向的,也可以是单向的。在 UML 类图中,双向的关联可以用带两个箭头或者没有箭头的实线来表示,单向的关联用带一个箭头的实线来表示,箭头从使用类指向被关联的类。也可以在关联线的两端标注角色名,代表两种不同的角色。在代码中通常将一个类的对象作为另一个类的成员变量来实现关联关系。先来看个双向关联的,下面是老师和学生的关系图,每个老师可以教多个学生,每个学生也可向多个老师学,他们是双向关联

将下面类图转换成相应java代码 根据类图编写代码_将下面类图转换成相应java代码_04


当顾客买东西,每个顾客都有一个地址,这通过让Customer类持有一个类型为Address的成员变量类实现。看下面的单向关联

将下面类图转换成相应java代码 根据类图编写代码_将下面类图转换成相应java代码_05


还有一种关联是自关联的,自关联在UML类图中用一个带有箭头且指向自身的直线表示。下图的意思就是Node类包含类型为Node的成员变量,也就是“自己包含自己”

将下面类图转换成相应java代码 根据类图编写代码_将下面类图转换成相应java代码_06


下面补充个知识点,如果有多个类的关联关系,如何判断多重性?下面用个最简单的图来表示,让你一目了然!

将下面类图转换成相应java代码 根据类图编写代码_将下面类图转换成相应java代码_07


为了方便好记,我总结出来一句话!(两同,两边取大,不同,错位取大)!

将下面类图转换成相应java代码 根据类图编写代码_uml_08


将下面类图转换成相应java代码 根据类图编写代码_将下面类图转换成相应java代码_09


将下面类图转换成相应java代码 根据类图编写代码_UML_10


将下面类图转换成相应java代码 根据类图编写代码_类图_11

4.聚合关系(Aggregation)

聚合关系是关联关系的一种,是强关联关系,是整体和部分之间的关系,在 UML 类图中,聚合关系可以用带空心菱形的实线来表示,菱形指向整体,例如:A类是整体,B类是部分。A类由B类构成,同时B类即便不在A类中也可以单独存在。下面看下Car(汽车)和type(轮胎)的关系,轮胎离开了机车还是可以单独纯在的,所以用聚合关系

将下面类图转换成相应java代码 根据类图编写代码_类图_12

5.组合关系(Composition)

组合关系也是关联关系的一种,也表示类之间的整体与部分的关系,但它是一种更强烈的聚合关系。在组合关系中,在 UML 类图中,组合关系用带实心菱形的实线来表示,菱形指向整体,整体对象可以控制部分对象的生命周期,一旦整体对象不存在,部分对象也将不存在,部分对象不能脱离整体对象而存在。例如,头和嘴的关系,没有了头,嘴也就不存在了。

将下面类图转换成相应java代码 根据类图编写代码_关联关系_13

6.接口实现关系(Realization)

实现关系是接口与实现类之间的关系。在这种关系中,类实现了接口,类中的操作实现了接口中所声明的所有的抽象操作。在 UML 类图中,实现关系使用带空心三角箭头的虚线来表示,箭头从实现类指向接口。比如我创建了一个接口Aminal

将下面类图转换成相应java代码 根据类图编写代码_类图_14

public interface Animal 
{
    public void eat();
}

注意在方法上应当有<>表示这是一个接口。接口一般没有属性,所以这里中间层没有,有属性要注意也都是常量。看下面UML类图

将下面类图转换成相应java代码 根据类图编写代码_UML_15

public class Dog implements Animal 
{
    public void eat() 
    {
        // dog eat的逻辑
    }
}
public class Cat implements Animal 
{
    public void eat() 
    {
        // cat eat的逻辑
    }
}

有一个Dog和一个Cat分别实现了Animal,Dog和Cat的实现不一样!最终你调用 Animal.eat方法来决定用dog类的eat还是cat类的eat方法!