设计模式01:统一建模语言UML基础知识
统一建模语言UML(Unified Modeling Language)是一种可视化的标准建模语言,它是一种分析和设计语言,通过UML可以构造软件系统的蓝图。
使用UML建模的目的是把所要设计的结构和系统的行为联系起来,并对系统的结构进行可视化控制。
1.UML的结构
UML是由图形符号表达的建模语言,其结构主要包括以下几个部分。
1.1视图(View)
在UML建模过程中,使用不同的视图从不同的角度来描述软件系统。UML包括5种视图,分别为用户视图、结构视图、行为视图、实现视图和环境视图,如图1所示。
图1 UML中的5种视图
其中,用户视图以用户的观点表示系统的目标,它是所有视图的核心,该视图描述系统的需求。结构视图表示系统的静态行为,描述系统的静态元素,如包、类与对象,以及他们之间的关系。行为视图表示系统的动态行为,描述系统的组成元素,如对象在系统运行时的交互关系。实现视图表示系统中逻辑元素的分布,描述系统中物理文件以及他们之间的关系。环境视图表示系统中物理元素的分布,描述系统中硬件设备以及他们之间的关系。
1.2图(Diagram)
在UML中提供了13种图与上述5种视图相对应,这13种图分别为用例图、类图、对象图、包图、组合结构图、状态图、活动图、顺序图、通信图、定时图、交互概览图、组件图和部署图。
以下简单介绍其中比较常用的几种图。在设计模式中,最常使用的是类图、状态图和顺序图。
用例图(Use Case Diagram)又称为用况图,对应于用户视图。在用例图中,使用用例来表示系统的功能需求,用例图用于表示多个外部执行者与系统用例之间以及用例与用例之间的关系。
类图(Class Diagram)对应于结构视图。类图使用类来描述系统的静态结构,描述了系统内所声明的类以及类之间的关系,但没有描述系统运行时类的行为。
状态图(State Diagram)对应与行为视图。状态图用来描述一个特定对象的所有可能状态及其引起状态转移的事件。一个状态图包括一系列对象的状态及状态之间的转换。
活动图(Activity Diagram)对应于行为视图。活动图用来表示系统中各种活动的次序。既可以用来描述用例的工作流程,也可以用来描述类中某个方法的操作行为。
顺序图(Sequence Diagram)又称为时序图或序列图,对应于行为视图。顺序图用于表示对象之间的交互,重点表示对象之间发送消息的时间顺序。
组件图(Component Diagram)又称为构件图,对应于实现视图。组件图用于描述每个功能所在的组件位置以及他们之间的关系。
部署图(Deployment Diagram)又称为实施图,对应于环境视图。部署图用于描述软件中各个组件驻留的硬件位置以及这些硬件之间的相互关系。
13种图与5种视图之间的对应关系如图2所示。
图2 UML中13种图与5种视图的对应关系
1.3模型元素(Model Element)
在UML中,模型元素包括事物以及事物与事物之间的联系。
1.4通用机制(General Mechanism)
UML提供的通用机制为模型元素提供额外的注释、修饰和语义等,主要包括规格说明、修饰、公共分类和扩展机制四种。
2.类图
类图是使用频率最高的UML图之一。在设计模式中,通常使用类图来描述一个模式的结构。
2.1类图的表示方法
在UML中,类图用来描述不同的类和它们之间的关系,由具有类名称、属性、操作分隔的长方形来表示。如图3所示,定义了一个Employee类,它包含属性name、age和email,以及操作modifyInfo()。
图3 类图示例
从图3可以看出,在UML类图中,类一般由三部分组成:类名、属性和操作。
类名:类名是一个字符串。
属性:属性是指类的成员变量,类可以有任意多个属性,也可以没有属性。UML规定属性的表示方法如下:
可见性 名称:类型 [ = 默认值]
其中,可见性表示该属性对类外的元素是否可见,包括共有、私有和受保护三种,在类图中分别用符号“+”、“—”和“#”表示。在Java语言中增加了一种包内可见性,在类图中用符号“*”来表示。名称表示属性名,是一个字符串。类型表示定义属性的数据类型,可以是基本数据类型,也可以是用户自定义类型。默认值是一个可选项,表示属性的初始值。
操作:操作是指类的任意一个实例对象都可以使用的方法,操作是类的成员方法。UML规定操作的表示方法如下:
可见性 名称(参数列表):返回值类型
其中,可见性的定义与属性的可见性定义相同。名称表示操作名或方法名,是一个字符串。参数列表表示操作的参数,参数个数是任意的,多个参数之间用逗号隔开。返回值类型表示操作的返回值类型,可以是基本的数据类型,也可以是用户自定义类型,还可以是空类型,如果是构造方法,则无返回值类型。
2.2类之间的关系
在软件系统中,类不是孤立存在的,类与类之间存在相互的关系,这些相互关系可以通过UML来描述。类之间的常用关系有关联关系、依赖关系、泛化关系和接口与实现关系。
2.2.1关联关系
关联关系是类与类之间最常用的一种关系,它是一种结构化关系,用于表示一类对象与另一类对象之间有联系。在UML类图中,用实线连接有关联的对象所对应的类。
关联关系有6种不同的类型,分别是双向关联、单向关联、自关联、重数性关联、聚合关系和组合关系。
其中,双向关联用直线表示;单向关联和自关联用带箭头的直线表示;重数性关联可以在关联直线上增加一个数字表示与之对应的另一个类的对象的个数;聚合关系表示一个整体与部分的关系,用带空心菱形的直线表示;组合关系也表示类之间整体与部分的关系,用带实心菱形的直线表示。
聚合关系和组合关系的区别在于,在组合关系中部分与整体具有统一的生存期,一旦整体对象不存在,部分对象也将不存在,部分对象与整体对象之间具有同生共死的关系。
2.2.2依赖关系
依赖关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系。在UML中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。
2.2.3泛化关系
泛化关系也称为继承关系,用于描述父类与子类之间的关系。在UML中,泛化关系用带空心三角形的直线表示。
2.2.4.接口与实现关系
在接口中,一般没有属性,而且所有的操作都是抽象的,只有操作的声明,没有操作的实现。在UML中,类与接口之间的实现关系用带空心三角形的虚线表示。
3.状态图
状态图用于描述对象的各种状态以及状态之间的转换。
3.1状态图的组成元素
在UML状态图中包含如下组成元素:
状态:又称为中间状态,用圆角矩形框表示,在一个状态图中可有多个状态,每个状态包含两格,上格放置状态名称,下格说明处于该状态时对象可以进行的活动。
初始状态:又称为初态,用一个黑色的实心圆圈表示,在一个状态图中只能够有一个初始状态。
结束状态:又称为终止状态或终态,用一个实心圆外加一个圆圈表示,在一个状态图中可能有多个结束状态。
转移:用从一个状态到另一个状态之间的连线和箭头说明状态的转移情况,并用文字说明引发这个状态变化的相应事件是什么。状态之间的转移可带有标注,由三部分组成(每一部分都可省略),其语法为:事件名[条件]/动作名。
一个简单的状态图示意图如图4所示。
图4 状态图示意图
4.顺序图
顺序图是最常用的系统动态建模工具之一,用于表示对象之间的动态交互,而且以图形化的方式描述了对象间消息传递的时间顺序。
4.1顺序图组成元素
在UML中,顺序图将交互关系表示为一个二维图,纵向是时间轴,时间沿竖线向下延伸;横线轴表示在交互过程中的对立对象,对象的活动用生命线表示。
顺序图由执行者、生命线、对象、激活框和消息等元素组成。
执行者是交互的发起人,使用与用例图一样的“小人”符号表示,在有些交互过程中无须使用执行者。
生命线用一条纵向虚线表示。
对象表示为一个矩形,其中对象名称标有下划线。
激活是过程的执行,包括等待过程执行的时间。
消息是对象之间的通信,是两个对象之间的单路通信,是从发送者到接收者之间的控制信息。消息在顺序图中由有标记的箭头表示,箭头从一个对象的生命线指向另一个对象的生命线,消息按时间顺序在图中从上到下排列。
一个简单的顺序图示意图如图5所示。
图5 顺序图示意图
备注:本博文根据刘伟主编的《设计模式》第一章学习总结而得。