UML类图

UML(Unified Modeling Language,统一建模语言)是用来设计软件蓝图的可视化建模语言,是一种为面向对象系统的产品进行说明、可视化和编制文档的标准语言,独立于任何一种具体的程序设计语言。
1997 年 UML 被国际对象管理组织(OMG)采纳为面向对象的建模语言的国际标准。它的特点是简单、统一、图形化、能表达软件设计中的动态与静态信息。

UML类图

在 UML 2.0 的 13 种图中,类图(Class Diagrams)是使用频率最高的 UML 图之一。类图描述系统中的类,以及各个类之间的关系的静态视图,能够让我们在正确编写代码之前对系统有一个全面的认识。类图是一种模型类型,确切地说,是一种静态模型类型。类图表示类、接口和它们之间的协作关系,用于系统设计阶段。

  • 抽象类或抽象方法用斜体表示
  • 如果是接口,则在类名上方加 <<Interface>>
  • 字段和方法返回值的数据类型非必需
  • 静态类或静态方法加下划线

类(Class)是指具有相同属性、方法和关系的对象的抽象,它封装了数据和行为,是面向对象程序设计(OOP)的基础,具有封装性、继承性和多态性等三大特性。在 UML 中,类使用包含类名、属性和操作且带有分隔线的矩形来表示。

  • 类名(name)

  • 属性(Attribute) 指类的变量,java中对应字段(field) UML格式
    [可见性]属性名:类型[=默认值]
    []内为可选属性
    +表示public
    -表示private  
    #表示protected 
    ~表示default,也就是包权限  
    
    例如:
    -name:String
    +sex:String="男"
    #age:int
    ~weight:long
    
  • 操作(Operations) 指类的方法,java中对应方法(method)
    UML格式
     [可见性]名称(参数列表)[:返回类型]
    
    例如:
    +eat(String food):void
    -sleep():void
    +isWake():boolean
    

    UML类示意
    UML类图

接口

接口在类名上方加 <<Interface>>
接口

类之间的关系

UML 将事物之间的联系归纳为 6 种,并用对应的图形类表示。下面根据类与类之间的耦合度从弱到强排列。UML 中的类图有以下几种关系:依赖关系、关联关系、聚合关系、组合关系、泛化关系和实现关系。其中泛化和实现的耦合度相等,它们是最强的。

依赖

依赖(Dependency)关系是一种使用关系,它是对象之间耦合度最弱的一种关联方式,是临时性的关联。在代码中,某个类的方法通过局部变量、方法的参数或者对静态方法的调用来访问另一个类(被依赖类)中的某些方法来完成一些职责。

依赖关系:

  • 类中用到了对方
  • 如果是类的成员属性
  • 如果是方法的返回类型
  • 是方法接收的参数类型
  • 方法中使用到

依赖关系使用带箭头的虚线来表示,箭头从使用类指向被依赖的类

public class PersonServiceBean {

    private PersonDao personDao;//类

    public void save(Person person){}

    public IDCard getIDCard(Integer personid){}

    public void modify(){
        Department department = new Department();
    }
}
public class PersonDao{}

public class IDCard{}

public class Person{}

public class Department{}

依赖关系

关联

关联关系是对象之间的一种引用关系,用于表示一类对象与另一类对象之间的联系,是依赖关系的特例。如老师和学生、师傅和徒弟、丈夫和妻子等。关联关系是类与类之间最常用的一种关系,分为一般关联关系、聚合关系和组合关系。

关联可以是双向的,也可以是单向的。在 UML 类图中,双向的关联可以用带两个箭头或者没有箭头的实线来表示,单向的关联用带一个箭头的实线来表示,箭头从使用类指向被关联的类。也可以在关联线的两端标注角色名,代表两种不同的角色。

关系具有多重性:如”1”(表示有且仅有一个),”0…“(表示0个或多个),”0,1”(表示0个或1个),”n…m”(表示n到m个都可以),”m…“(表示至少m个)

单向一对一关系

public class Person{
    private IDCard idCard;
}

public class IDCard{

}

单向一对一关联关系
双向一对一关系

public class Person{
    private IDCard idCard;
}

public class IDCard{
    private Person person;
}

双向一对一关联关系

聚合

聚合关系表示的是整体和部分的关系,是 has-a 的关系,整体与部分可以分开。聚合关系是关联关系的特例,所 以他具有关联的导航性与多重性。

在 UML 类图中,聚合关系可以用带空心菱形的实线来表示,菱形指向整体。
聚合关系也是通过成员对象来实现的,其中成员对象是整体对象的一部分,但是成员对象可以脱离整体对象而独立存在。如:一台电脑由键盘(keyboard)、显示器(monitor),鼠标(mouse)等组成;组成电脑的各个配件是可以从电脑上分离出来 的。

public class Computer{
    private Monitor monitor;

    private Mouse mouse;

    public void setMonitor(Monitor monitor){
        this.monitor = monitor;
    } 
  
    public void setMouse(Mouse mouse){
        this.mouse = mouse;
    }   
}

public class Monitor{

}

public class Mouse{

}

聚合关系

组合

也是整体与部分的关系,但是整体与部分不可以分开,是一种更强烈的聚合关系,是 cxmtains-a 关系。在组合关系中,整体对象可以控制部分对象的生命周期,一旦整体对象不存在,部分对象也将不存在,部分对象不能脱离整体对象而存在。例如,头和嘴的关系,没有了头,嘴也就不存在了。

在 UML 类图中,组合关系用带实心菱形的实线来表示,菱形指向整体。
如:在程序中我们定义实体,Person 与IDCard、Head, 那么 Head 和 Person 就是组合,IDCard 和 Person 就是聚合。

public class Person{
    private IDCard card;

    private Head head = new Head();
}

public class IDCard{

}

public class Head{

}

聚合与组合

但是如果在程序中Person 实体中定义了对IDCard 进行级联删除,即删除Person 时连同IDCard 一起删除,那 么IDCard 和 Person 就是组合了。

泛化(继承)

泛化(Generalization)关系是对象之间耦合度最大的一种关系,表示一般与特殊的关系,是父类与子类之间的关系,是一种继承关系,是 is-a 的关系。

在 UML 类图中,泛化关系用带空心三角箭头的实线来表示,箭头从子类指向父类。

public abstract class DaoSupport{
    public void save(Object entity){}

    public void delete(Object id){}
}
public class PersonServiceBean extends Daosupport{
}

泛化关系

实现

实现(Realization)关系是接口与实现类之间的关系。在这种关系中,类实现了接口,类中的操作实现了接口中所声明的所有的抽象操作。

在 UML 类图中,实现关系使用带空心三角箭头的虚线来表示,箭头从实现类指向接口

public interface PersonService {
    void delete(Interger id);
}

public class PersonServiceBean implements PersonService {
    public void delete(Interger id){}
}

实现关系