需求分析与系统设计总结(四)
三. 可视化模型基础
用例图:
1.概念:
用例图(Use Case Diagram):主要用于描述系统的行为及各种功能之间的关系,是描述参与者(Actor)与用例以及用例与用例之间关系的图。
用例图 = 参与者 + 用例 + 关系
2.用途:
用例图显示谁将是相关的用户、用户希望系统提供什么服务以及用户需要为系统提供的服务。
通俗的说:描述参与者与用例之间的关系,帮助开发人员可视化的了解系统功能。
3、用例图包含的元素
参与者(Actor):参与者可以是人或其他外界系统。
参与者是用例的启动者,参与者处于用例的外部并且能够初始化一个用例并参与用例的执行过程,但它并不是系统的一部分。每个参与者可以参与一个或多个用例。
用例(Use Case):用例是一组动作序列(业务工作流程)的描述,系统执行该动作序列为系统的参与者产生一个可观察的结果。用例反映用户的需求。
用例是系统的使用过程,是对系统的用户功能需求的描述,用例表达了系统的功能和所提供的服务。
关系
关联关系:参与者与用例之间进行关联。表示参与者可以启动(使用)该用例。
包含关系:用例与用例之间的关系
把几个用例的公共步骤分离成一个单独被包含用例;包含用例称为客户用例,被包含用例称为提供者用例。用例A包含用例B,将A称为基用例,B称为被包含用例。
包含关系表示基用例一定会用到被包含用例。被包含用例的事件流在基用例的某个点处插入到基用例的事件流中。
扩展关系:用例与用例之间的关系
扩展使得每个用例可以通过扩展用例向基用例中添加额外的行为来扩展基用例的功能。用例A扩展了用例B,那么A称为扩展用例或子用例,B表示为基用例。
扩展用例A的事件流在一定的条件下按照相应的扩展点插入到基用例中,这就需要在基用例中定义一至多个已命名的扩展点。
泛化关系:继承,泛化关系是两个用例或两个参与者之间的关系。
泛化关系其实可以通俗理解为面向对象关系中的继承。将拥有一种类似的结构和行为的多个用例中的共性抽象为父用例,子用例继承父用例中的所有
4.系统边界:
界定系统的范围,在UML用例视图中使用system元素表示软件系统的范围。System可以包含一些用例,并界定系统的边界,边界之内的属于系统的功能和行为,边界之外的则不是系统所关心的内容。
类图:
1、 概念:
显示了模型的静态结构,特别是模型中存在的类、类的内部结构以及它们与其他类的关系等。类图是面向对象建模的主要组成部分
类视图=类(类的内部结构)+关系
2、包含的元素:
类,属性,方法
3. 关系(泛化/关联/组合/依赖/实现):
泛化(Generalization)
是一种继承关系, 表示一般与特殊的关系, 它指定了子类如何特化父类的所有非private修饰的特征和行为,比如说人有男人和女人,男人和女人即有共性的地方也有差异的地方
箭头指向:带三角箭头的实线,箭头指向父类。
表示的类和类之间,以及接口与接口之间的关系。类是单继承,接口是多继承。
实现(Realization):
实现和我们java中的实现是一个意思,是一种类与接口的关系, 表示类是接口特征和行为的实现
箭头指向:带三角箭头的虚线,箭头指向接口
关联(Association):
是一种拥有(has a)的关系, 它使一个类知道另一个类的属性和方法,即:一个对象A中持有对象B的引用,对象A就可以使用对象B的方法和属性。在实际的代码中体现在一个类上声明一个成员变量。
箭头及指向:带普通箭头的实心线,指向被拥有者。
单向关联:
类的关联关系也可以是单向的,单向关联用带箭头的实线表示。例如:顾客(Customer)拥有地址(Address),则Customer类与Address类具有单向关联关系。
双向关联:
默认情况下,关联是双向的。例如:顾客(Customer)购买商品(Product)并拥有商品,反之,卖出的商品总有某个顾客与之相关联。因此,Customer类和Product类之间具有双向关联关系。
自关联:
在系统中可能会存在一些类的属性对象类型为该类本身,这种特殊的关联关系称为自关联。例如:一个节点类(Node)的成员又是节点Node类型的对象。
多重性关联:
多重性关联关系又称为重数性(Multiplicity)关联关系,表示两个关联对象在数量上的对应关系。在UML中,对象之间的多重性可以直接在关联直线上用一个数字或一个数字范围表示。
对象之间可以存在多种多重性关联关系。
组合(Composition):
是整体与部分的关系, 但部分不能离开整体而单独存在. 如公司和部门是整体和部分的关系, 没有公司就不存在部门
组合关系是关联关系的一种,是比聚合关系还要强的关系,它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期
在代码实现组合关系时,通常在整体类的构造方法中直接实例化成员类
实心菱形带箭头的实线,菱形指向整体,箭头指向的部分。
依赖(Dependency):
是一种使用的关系, 即一个类的实现需要另一个类的协助,所以要尽量不使用双向的互相依赖
代码表现:局部变量、方法的参数或者对静态方法的调用
带箭头的虚线,箭头指向被使用者,虚线出发表示使用者
4.各种关系的强弱顺序:
泛化 >实现>组合> 聚合> 关联> 依赖
总结:
(1) 依赖关系:关系对象出现在局部变量或者方法的参数里,或者关系类的静态方法被调用
(2) 关联关系:关系对象出现在实例变量中
(3) 聚合关系:关系对象出现在实例变量中,成员对象通常作为构造方法、Setter方法或业务方法的参数注入到整体对象中
(4) 组合关系:关系对象出现在实例变量中,通常在整体类的构造方法中直接实例化成员类。
(5) 泛化关系: extends
(6) 实现: implements
时序图:
1.概念:
显示对象之间交互的图。
对象按时间顺序排列。
显示参与对象之间消息交互的顺序。
2.包含的元素:
角色(Actor)
用以表示和系统进行交互的参与者角色,不一定是人也可以是物或者系统。UML时序图中用一个小人来表示角色
对象(Object)
对象就是类的实例。UML时序图中用矩形框来表示对象。
控制焦点 ( Focus of Control ) / 激活(Activation)
控制焦点代表对象在某一用例过程中执行某一操作的时间。UML时序图中用方块来表示控制焦点
消息(Message)
消息是角色和对象或者对象与对象之间的信息传递。消息分为三种:同步消息、异步消息、返回消息、自关联消息。
同步消息(Synchronous Message):把信息传递给接受者后,停止活动,等待返回结果。使用(实线)
异步消息(Asynchronous Message):把信息传递给接受者后,不用等待返回结果。可以直接开始下一个活动。UML图表示如下
返回消息(Return Message):代表从过程调用返回。
自关联消息(Self-Message):自关联消息表示方法的自身调用或者一个对象内的一个方法调用另外一个方法。
状态图:
1.概念:
状态图(Statechart Diagram)主要用于描述一个对象在其生存期间的动态行为,表现为一个对象所经历的状态序列,引起状态转移的事件(Event),以及因状态转移而伴随的动作(Action)。
从对象的初始状态起,开始响应事件并执行某些动作,这些事件引起状态的转移;对象在新状态下又开始响应事件和执行动作,如此连续进行直到终结状态。
状态图(State Diagram) =状态(State) + 迁移(Transition)
2.包含的元素:
状态
指在对象的生命周期中的某个条件或者状况,在此期间对象将满足某些条件、执行某些活动等。所有对象都有状态,状态是对象执行了一系列活动的结果,当某个事件发生后,对象的状态将发生变化
状态组成:
状态=状态名+动作(可选)
entry:入口动作。当进入一个状态的时候执行。
do:内部活动。当状态处于激活时执行
exit:出口动作。当离开一个状态的时候执行。
状态分类:
简单状态:没有子结构的状态
复合状态/组合状态:被分成两个或者多个并发子状态,当复合状态被激活时,所有的子状态均被激活
初始状态:表示状态机状态的起点。
终止状态:表示完成了状态机的状态转换历程中的所有活动。
转移
转移(Transitions)是两个状态之间的一种关系,表示对象将在源状态(Source State)中执行一定的动作,并在某个特定事件发生而且某个特定的警界条件满足时进入目标状态(Target State)
转移的组成:
事件标记(Trigger):是转移的诱因,可以是一个信号,事件、条件变化(a change in some condition)和时间表达式。
警界条件(Guard Condition):当警界条件满足时,事件才会引发转移(Transition)。
结果(Effect):对象状态转移后的结果f
3.线程状态图:
1.新建:初始化对象。new Thread()
2.就绪:调用start()方法
3.运行:执行run()方法
4.阻塞:
等待阻塞:运行(running)的线程执行o.wait()方法,
JVM会把该线程放入等待队列(waitting queue)中
同步阻塞:运行(running)的线程在获取对象的同步锁时,
若该同步锁被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。
其他阻塞:运行(running)的线程执行Thread.sleep(long ms)
或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。
当sleep()状态超时、join()等待线程终止或者超时、
或者I/O处理完毕时,线程重新转入可运行(runnable)状态。
7.销毁:run()方法执行完成。