1.面向对象开发需要经过3个阶段
1)面向对象分析(OOA)
OOA对目标系统进行分析,建立分析模型,并将之文档化。
2)面向对象设计(OOD)
OOD用面向对象的思想对OOA的结果进行细化,得出设计模型。
3)面向对象编程(OOP)
2.UML基础概念
OOA和OOD分析、设计结果需要统一的符号来描述、交流并记录,UML就是这种用于描述、记录OOA和OOD结果的符号表示法。
UML 2.0一共包括13种正式图形:活动图(activity diagram)、类图(class diagram)、通信图(communication diagram)、组件图(component diagram)、复合结构图(composite structure diagram)、部署图(deployment diagram)、交互概观图(interaction overview diagram)、对象图(object diagram)、包图(package diagram)、顺序图(sequence diagram)、状态机图(state machine diagram)、定时图(timing diagram)、用例图(use case diagram)。
最常用的UML图包括用例图、类图、组件图、部署图、顺序图、活动图和状态机图。
1)用例图
用例图主要在需求分析阶段使用,用于描述系统实现的功能,方便与客户交流,保证系统需求的无二性,用例图与系统的各个类之间没有任何联系。
用例图用于描述系统提供的系统功能,每个用例代表系统的一个功能模块。用例图的主要目的是帮助开发团队以一种可视化的方式理解系统的需求功能。
用例图包括用例(以一个椭圆表示)、角色(Actor,也就是与系统交互的其他实体,以一个人形符号表示)、角色和用例之间的关系(以简单的线段来表示),以及系统内 用例之间的关系。用例图可以用于表示整个系统的全部用例,或者完成具体功能的一组用例。
下图是一个简单的BBS系统的部分用例示意图。
2)类图
类图表示系统中应该包含哪些实体,各实体之间如何关联。类图可用于表示逻辑类,逻辑类通常就是业务人员所涉及的事物种类。
a.类在类图上使用包含3个部分的矩形来描述,最上面的部分显示类的名称,中间部分包含类的属性,最下面的部分包含类的方法,如下图。
类之间有三种基本关系:关联(包括聚合、组合),泛化(与继承同一个概念),依赖。
b.关联具有一定的方向性,如果仅能从一个类单方向地访问另一个类,则被称为单向关联,如果两个类可以互相访问对象,则被称为双向关联。关联用一条实现表示,带箭头的实现表示单向关联。
关联关系有两种特例:聚合和组合,他们都是部分和整体的关系。聚合是一种松散对象之间的关系,例如学生和校篮球俱乐部;组合是一种非常强的对象之间的关系,例如:手臂和学生,在组合中,部分和整体的生命周期一样的。
下图简单的类图示意图。
c.泛化与继承是同一个概念,都是指子类是一种特殊的父类,继承关系使用带空心的三角形的实现表示,如下图。
d.依赖
如果一个类的改动会导致另一个类的改动,则称两个类之间存在依赖。依赖关系使用带箭头的虚线表示,其中箭头指向被依赖的实体。依赖的常见可能原因如下:
改动的类将消息发给另一个类。
改动的类以另一个类作为数据部分。
改动的类以另一个类作为操作参数。
3)组件图
组件图提供系统的物理视图。它的用途是显示系统中的软件对其他软件组件的依赖关系。组件图可以在一个非常高的层次显示,从而仅显示粗粒度的组件,也可以在组件包层次上显示。UML使用一个特殊的符号来表示组件,如下图:
上图系统提供了一个Stock Information组件,该组件向其他组件提供股票信息,而该组件底层自依赖于Servlet2.4 API组件,JDBC API组件和Web Container组件。
4)部署图
现代的软件工程的不同部分可能需要部署在不同地方,不同平台之上。部署图用于描述软件系统如何部署到硬件环境中。它的用途是显示软件系统不同的组件将在何处物理地运行,以及他们将如何彼此通信。
部署图中的符号包括组件图中所使用的符号元素,另外还增加了几个符号,主要是增加了节点的概念:节点是各种计算资源的通用名称,主要包含处理器(能够执行程序)和设备(不具备计算能力的硬件,如打印机)两种类型。如下图显示了一个简单的部署图。
5)顺序图
顺序图显示具体用例的详细流程,并且显示了流程中不同对象之间的调用关系,同时还可以很详细地显示对不同对象的不同调用。顺序图描述了对象之间的交互,重点在于描述消息及其时间顺序。
顺序图有两个维度:垂直维度以发生的时间顺序显示消息/调用的序列;水平维度显示消息被发送到的对象实例。顺序图的关键在于对象之间的消息,消息通常表现为对象调用另一个对象的方法或方法的返回值,发送者和接受者之间的箭头表示消息。
顺序图的顶部每个框表示每个类的实例,如果某个类实例向另一个类实例发送一条消息,这绘制一条具有指向接受类实例的带箭头的连线,并把消息/方法的名称放在连线上面。
对于特别重要的消息,还可以绘制一条带箭头的,指向发起类实例的虚线,将返回值标注在虚线上。
对象的激活期不是其存在的时间,而是它占据CPU的执行时期,绘制顺序图时,激活期要精确。
绘制顺序图主要帮助开发者对某个用例的内部执行清晰化,而需要考察某个用例内部若干对象行为时,应使用顺序图,顺序图善于表现对象之间的协作顺序,不善于表现行为的精确定义。如下图显示了用户登录的顺序图。
6)活动图
活动图和状态机图都被称为演化图,其区别和联系如下:
活动图:用于描述用例内部的活动或方法的流程,如果除去活动图中的并行活动描述以后,它就变成流程图。
状态机图:描述某一对象生命周期中需要关注的不同状态,并会详细描述刺激对象状态改变的事件,以及对象状态改变时所采取的动作。
演化图的五要素如下:
状态
事件:来自对象外界的刺激,通常形式是消息的传递。事件是对象状态发生改变的原动力。
事件通常包含两种类型:
内部事件:从系统内部激发的事件,一个对象的方法调用,(通过事件激活)另一个对象的方法。
外部事件:从系统边界外激发的事件,例如用户鼠标,键盘动作。
动作:对象对于事件所做的处理,实际上通常表现为某个方法被执行。
活动:动作激发的后续系统行为。
条件:事件发生所需要具备的条件。
活动图主要用于描述过程原理,业务逻辑以及工作流技术。
下图显示了简单的活动图。
7)状态机图
状态机图表示某个类所处的不同状态和该类的状态转换信息,在系统活动期间具有三个更多潜在状态的类才需要考虑使用状态机图进行描述。
状态机图包括5个基本元素:
初始状态,使用实心圆绘制;
状态之间的转换,使用具有带箭头的线段来绘制;
状态,使用圆角矩形来绘制;
判断点,使用空心圆来绘制;
一个或者多个终止点,使用内部包含实心圆的圆来绘制。
状态机图擅长表现单个对象的跨用例行为,对于多个对象协作的行为应该考虑采用顺序图。
下图显示了Hibernate持久化对象的状态机图。