UML图
UML,即统一建模语言(Unified Modeling Language),是一种对软件密集系统进行可视化建模的语言。UML的定义包括UML语义和UML表示法两个元素,其模型大多以图表的方式表现出来,包括块或框、连接线和作为模型附加信息之用的文本。
UML图的主要好处体现在其通用性、灵活性和可视化上。UML是一种通用的建模语言,可以应用于多种领域的软件开发中。同时,UML提供了多种表现形式,可以根据不同的需求和开发阶段选择不同的建模方式。此外,UML采用图形符号进行建模,使得软件结构和设计思路变得直观可见,便于开发人员理解和沟通。
本文中只介绍类图、时序图的使用。
1.UML类图
UML类图(Unified Modeling Language Class Diagram)是UML(统一建模语言)中的一种重要图形,用于描述面向对象编程(OOP)中类的结构以及它们之间的关系。类图展示了系统中的各种类、接口以及它们之间的静态关系,包括继承、实现、关联、依赖等。
UML类图是面向对象分析和设计的重要工具,它帮助开发人员理解系统的结构,以及如何在代码中实现这些结构。通过类图,开发人员可以更加清晰地看到系统中的各个类和它们之间的关系,从而更容易地编写出高质量、易于维护和扩展的代码。
1.1 类图中具体类、抽象类、接口和包的表示法
访问修饰符的表示方法是统一的,这里优先说明:
访问修饰符的表示方法:
- “+” 表示public
- “-” 表示private
- “#” 表示protected
- 不带符号表示default
1.1.1 表示具体类
在UML类图中,具体类也是用矩形框来表示的。这个矩形框通常分为三层,分别代表类的不同元素。
- 最顶层是类名,用于标识类的名称。这是类图中最直接和明显的部分,它告诉读者这个矩形框所代表的类的名字。
- 第二层是类的成员变量或者属性。这些属性描述了类的对象所持有的数据,是类的重要组成部分。在UML类图中,这些属性会被清晰地列出来,可能还包括它们的类型、可见性(如public、private、protected等)以及初始值(如果有的话)。
- 第三层是类的方法。方法是类能够执行的操作或行为的集合。在UML类图中,方法也会被明确地列出来,包括它们的名称、参数列表(如果有的话)、返回类型以及可见性。
1.1.2 表示抽象类
在UML类图中,抽象类具有特定的表示方法。
通常,抽象类也是用矩形框来表示,但抽象类的类名以及抽象方法的名字都用斜体字表示。这样,在查看类图时,可以直观地识别出哪些类是抽象的,以及它们包含哪些抽象方法。
1.1.3 表示接口
在UML类图中,接口通常使用带有名称的小圆圈或带有<< interface >>标记的矩形来表示。接口是一种特殊的类型,它描述了一组操作的契约,但没有提供这些操作的具体实现。类或其他接口可以实现接口,提供这些操作的具体实现。
以下是接口在UML类图中的具体表示方法:
- 棒棒糖表示法:在这种表示法中,接口用一个带有名称的小圆圈来表示,旁边写上相应的接口名称。这种表示法简洁明了,突出了接口作为一种契约或规范的特点。
- 带有<< interface >>标记的矩形:另一种表示法是将接口绘制为一个带有<>标记的矩形。这种表示法提供了更多的空间来列出接口中的方法或属性(虽然接口通常只包含方法,不包含属性)。接口的方法可以列在矩形内部,类似于类的表示方法。
1.1.4 表示包
在UML类图中,包通常用一个带有标签的矩形来表示。标签通常放在矩形的左上角,用于标识包的名称。包的名称应该清晰明了,能够反映包内元素的共同特征或功能。
包内可以包含多种类型的UML元素,如类、接口、组件等。这些元素在类图中以各自的表示方法呈现,但都被包含在同一个包的矩形内。这样可以直观地展示元素之间的归属关系和包的整体结构。
此外,包还可以具有嵌套结构,即一个包内可以包含其他包。这种嵌套关系在UML类图中可以通过将子包绘制在父包矩形内部来表示。
在表示包时,还需要注意元素的可见性。UML中的可见性包括公有(+)、私有(-)和保护型(#)。这些可见性修饰符可以应用于包内的元素,用于控制元素在包外的可见性。在UML类图中,这些修饰符通常放在元素名称的前面。
1.2 关系
类和类、类和接口、接口和接口之间存在一定关系,UML类图中一般会有连线指明它们之间的关系。UML(统一建模语言)图中的关系主要有四种:泛化(Generalization)、实现(Realization)、关联(Association)和依赖(Dependency)。如图所示:
下面我们详细讲述这些关系,以及在UML类图中如何表示这些关系。
1.2.1实现关系
类与接口之间的关系,表示类实现了接口的所有方法和行为。在UML图中,实现关系用带空心三角形的虚线表示,箭头从类指向接口。
1.2.2泛化关系
子类与父类之间的关系,也被称为继承关系。子类可以继承父类的属性和方法,从而减少代码的重复性,提高代码的可重用性和可维护性。在UML图中,泛化关系用带空心三角形的实线表示,箭头从子类指向父类。
1.2.3 关联关系
关联关系是一种表示类与类之间联系的方式。关联关系使一个类能够知道另一个类的属性和方法,它可以是单向的也可以是双向的。关联关系是通过使用成员变量来实现的。例如,在一个简单的场景中,有一个“徒弟”类和一个“唐僧”类,唐僧类可以有一个成员变量,这个成员变量是徒弟类的列表。这就体现了一个关联关系,即唐僧与徒弟之间存在关联。
关联关系可以分为一般关联关系、聚合关系和组合关系。
需要注意的是,关联关系与聚合关系、组合关系等有所不同。聚合关系强调的是整体与部分的关系,如汽车由引擎、轮胎等部件组成,这种关系也是通过成员变量来实现的,但所涉及的两个类处在不同的层次上,一个代表整体,一个代表部分。而组合关系则是聚合关系的一种更强形式,表示部分对象与整体对象具有相同的生命周期。
一般关联关系
在UML图中,关联关系通常通过实线来表示。如果是双向关联,则可能没有箭头或有两个箭头;如果是单向关联,则有一个箭头指向被关联的类。
聚合关系
聚合关系表示一种弱的“拥有”关系,是关联关系的一种特例,它体现的是整体与部分的拥有关系,整体和部分可以独立存在,用带空心菱形的实线表示,菱形指向整体,箭头指向部分。
组合关系
组合关系表示一种强的“拥有”关系,也是关联关系的一种特例,它同样体现整体与部分间的包含关系,部分不能离开整体单独存在,用带实心菱形的实线表示,菱形指向整体,箭头指向部分。
1.2.4 依赖关系
一种临时性的关联,表示一个类的实现需要使用另一个类的方法或属性。在UML图中,依赖关系用带箭头的虚线表示,箭头从使用类指向被依赖的类。依赖关系在Java中的具体代码表现形式为B为A的构造器或方法中的局部变量**、方法或构造器的参数、**方法的返回值,或者A调用B的静态方法。
下面我们用Java代码来演示对象和对象之间的依赖关系:
public class B {
public String field1; //成员变量
public void method1() {
System.println("在类B的方法1中");
}
public static void method2() { //静态方法
System.out.println("在类B的静态方法2中");
}
}
/*
A依赖于B
*/
public class A {
public void method1() {
//A依赖于B的第一种表现形式:B为A的局部变量
B b = new B();
b.method1();
}
public void method2() {
//A依赖于B的第二种表现形式: 调用B的静态方法
B.method2();
}
public void method3(B b) {
//A依赖于B的第三种表现形式:B作为A的方法参数
String s = b.field1;
}
public B method4() {
//A依赖于B的第四种表现形式:B作为A的方法的返回值
return new B();
}
}
2.时序图
待补充...