UML
UML(Unified Modeling Language)是一种用于描述、可视化、构建和文档化软件系统的标准建模语言。UML为软件开发提供了一套通用的、标准化的图形符号和规则,帮助开发者在不同的开发阶段中更好地理解和沟通软件系统的结构和行为。
UML不仅仅是一种图形表示工具,还提供了一种共享和传达软件设计概念和思想的通用语言。它在需求分析、设计、编码、测试和文档化等软件开发阶段都有广泛的应用。开发者可以使用UML来可视化和共享设计思想,从而更好地协作、理解和构建复杂的软件系统。
UML 从目标系统的不同角度出发,定义了用例图、类图、对象图、状态图、活动图、时序图、协作图、构件图、部署图等九种图。
类图概述
类图(Class Diagram)是UML中最常用的一种图,用于表示软件系统中的类、接口、关联关系、属性和方法等元素,以及它们之间的静态结构。类图是一种静态结构图,它帮助开发者理解系统的设计和结构。以下是类图的概述和关键元素:
-
类(Class):
- 类是类图中的主要元素,用于表示系统中的对象类型。一个类包括类名、属性和方法。
- 类名位于类图的顶部,通常以粗体显示。例如,“Person"或"Order”。
- 属性表示类的特征或数据成员,通常显示为名称和类型,例如,"name: String"表示一个名为"name"的字符串属性。
- 方法表示类的行为或操作,通常显示为名称和参数列表,例如,"getName(): String"表示一个返回字符串类型的方法。
-
关联关系(Association):
- 关联关系表示不同类之间的连接和关联。它可以是双向或单向的,还可以包括多重性信息,表示一个类与另一个类之间的关系。
- 关联关系通常由一条直线连接两个类,有时会在关联线上标明关系类型,如聚合、组合等。
-
继承关系(Inheritance):
- 继承关系表示一个类派生自另一个类,用于表示通用性与特殊性之间的关系。继承关系通常由一个带空心三角形的实线箭头连接父类和子类。
- 父类通常称为超类或基类,子类称为子类或派生类。
-
接口(Interface):
- 接口表示一组方法签名,没有实现细节。它们用于描述类必须实现的合同。
- 接口通常用带有特殊标记的矩形表示,例如,“<<interface>>”。
-
多重性(Multiplicity):
- 多重性表示关联关系中一个类与另一个类的关系数量。它通常显示在关联线的两端,例如,"1"表示一对一关系,"0…*"表示零个或多个关系。
-
依赖关系(Dependency):
- 依赖关系表示一个类依赖于另一个类。它通常由虚线箭头表示,箭头指向被依赖的类。
-
泛化(Generalization):
- 泛化关系表示继承关系,用于表示一个类派生自另一个类。它通常由一个实线箭头表示,箭头指向父类。
类图是设计和文档化软件系统的重要工具,它有助于开发者理清系统的结构,定义类的属性和方法,以及描述类之间的关系。类图通常是面向对象设计的起点之一,帮助开发者建立系统的静态模型。
类图作用
类图在软件设计和开发中具有重要的作用,它帮助开发者理解、设计和构建软件系统,提供了以下几个关键作用:
-
可视化设计:类图通过图形符号和图形化表示,将软件系统的结构和组成部分可视化,使开发者更容易理解系统的整体架构。
-
静态结构描述:类图描述了系统的静态结构,包括类、接口、属性、方法等元素,帮助开发者了解系统中各个对象之间的关系和属性。
-
代码生成:类图可以用于自动生成代码,尤其是在一些集成开发环境(IDE)中,开发者可以通过设计类图来生成初始代码框架,从而提高开发效率。
-
模块化设计:类图鼓励模块化设计,将系统分解为独立的类和模块,每个类都有特定的职责和功能,降低了系统的复杂度,提高了可维护性和可重用性。
-
通信和协作:类图可以用于描述对象之间的通信和协作方式,包括方法调用、依赖关系、关联关系等,帮助开发者理解系统的运行时行为。
-
代码重用:通过定义类和接口,类图促进了代码重用,开发者可以使用现有的类和接口来构建新的功能,而无需重新实现相同的代码。
-
系统文档:类图可以作为系统文档的一部分,帮助团队成员和利益相关者了解系统的设计和结构,以便更好地协作和维护系统。
-
错误预防:在设计阶段,类图可以帮助开发者发现和纠正潜在的设计错误和问题,减少后续开发阶段的修复成本。
-
迭代开发:类图允许开发者在设计过程中进行迭代,根据需求变化和反馈不断改进系统设计,有助于敏捷开发和快速响应变化。
类图是软件设计的重要工具,它帮助开发者在系统设计和开发过程中进行抽象、模块化和可视化,从而更好地理解、构建和维护复杂的软件系统。它不仅提高了软件开发效率,还有助于提高系统的质量和可维护性。
类图表示法
类的表示方法
在UML类图中,类使用包含类名、属性和方法且带有分割线的矩形来表示,如下图表示一个Customer类,它包含name、sex、address、phone这四个属性,以及add()、grow()、move()、isEmpty()三个方法
在属性/方法名前面加上加号和减号是表示这个属性/方法的可见性,在UML类图中表示可见性的符号有三种:
- +:表示public
- -:表示private
- #:表示protected
属性的完整的表示方式是:可见性 名称 :数据类型 [ = 缺省值]
方法的完整表示方式是:可见性 名称(参数列表) [ :返回值类型]
注意:
上面中括号里的内容是可选的。也可以将类型放在变量名前面,返回值类型放在方法名前面。
类与类之间关系的表达方式
关联关系
关联关系是对象之间的一种引用关系,用于表示一类对象与另一类对象之间的联系,例如老师与同学等关系。关联关系是类与类之间最常见的一种关系,分为一般关联关系、聚合关系和组合关系。
其中一般关联有可以分为单向关联、双向关联、自关联。
单向关联
在UML类图中单向关联用一个带箭头的实线表示。上图(为IDEA生成的类图,与传统类图表示有所不同)中表示每个Person都会有一个identity身份(例如学生),这通过Person类持有一个类型为Student的成员变量类实现。
双向关联
双向关联即双方各自持有对方类型的成员变量。
在UML类图中,双向关联用一个不带箭头的直线表示。上图在Customer类中维护了一个Product[],表示一个顾客可以购买多个商品,在Product类中维护一个Customer[]类型的成员变量表示这个产品被哪些客户购买。
自关联
自关联在UML类图中用一个带有箭头且指向自身的线表示。
聚合关系
聚合关系是关联关系的一种,是一种强关联关系,是整体和部分之间的关系。
聚合关系也是通过成员对象来实现的,其中成员对象是整体对象的一部分,但是成员变量可以脱离整体对象而独立存在。
在UML 类图中,聚合关系可以用带空心菱形的实线来表示,菱形指向整体。
组合关系
组合表示类之间的整体与部分的关系,但它是一种更强烈的聚合关系。
在组合关系中,整体对象可以控制部分对象的生命周期,一旦整体对象不存在,部分对象也会将不存在,部分对象不能脱离整体对象而存在。
在UML类图中,组合关系用带实行菱形的实线来表示,菱形指向整体。
这种关系在日常生活中较为常见,但是在创建定义类时并不常用。
依赖关系
依赖关系是一种使用关系,其是对象之间耦合度最弱的一种关联方式,是临时性的关联。在代码中,某个类的方法通过局部变量、方法的参数或者对静态方法的调用来访问另一个类(被依赖类)中的某个方法来实现完成一些职责。
在UML类图中,依赖关系是用带有箭头的虚线来表示,箭头从使用类指向被依赖类。
在真正的开发中是使用最多的。
继承关系
继承关系是对象之间耦合度最大的一种关系,表示一般与特殊的关系,是父类与子类之间的关系,是一种继承关系。
在UML类图中,泛华关系用带空心三角箭头的实线来表示,箭头从子类指向父类。在代码实现时,使用面向对象的继承机制来实现泛化关系。
实现关系
实现关系是接口与实现类之间的关系。在这种关系中,类实现了接口,类中的操作实现了接口中所声明的所有的抽象操作。
在UML类图中,实现关系使用带空心三角箭头的虚线来表示,箭头从实现类指向接口。