课程目标设计模式
一、经过从新认识 UML,掌握 UML 的定义、特色和分类架构
二、重点介绍类图和时序图各图例的含义。并发
三、掌握各类图例和标线的记忆技巧。异步
内容定位 ➡ 适合全部的 Java 开发人员。ide
统一建模语言(Unified Modeling Language,UML)是一种为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言,是非专利的第三代建模和规约语言。工具
UML 使用面向对象设计的的建模工具,但独立于任何具体程序设计语言。oop
UML 是在开发阶段,说明、可视化、构建和书写一个面向对象软件密集系统的制品的开放方法。最佳的应用是工程实践,对大规模,复杂系统进行建模方面,特别是在软件架构层次,已经被验证有效。测试
UML是一种模型化语言。模型大多以图表的方式表现出来。一份典型的建模图表一般包含几个块或框,链接线和做为模型附加信息之用的文本。这些虽简单却很是重要,在 UML 规则中相互联系和扩展。spa
UML 的目标是以面向对象图的方式来描述任何类型的系统,具备很宽的应用领域。其中最经常使用的是创建软件系统的模型,但它一样能够用于描述非软件领域的系统,如机械系统、企业机构或业务过程,以及处理复杂数据的信息系统、具备实时要求的工业系统或工业过程等。设计
总之,UML 是一个通用的标准建模语言,能够对任何具备静态结构和动态行为的系统进行建模,并且适用于系统开发的不一样阶段,从需求规格描述直至系统完成后的测试和维护。
UML2.0 一共有 13 种图形(UML1.5 定义了 9 种,2.0 增长了 4 种)。分别是:用例图、类图、对象图、状态图、活动图、时序图、协做图、构件图、部署图 9 种,包图、时间图、组合结构图、交互概览图 4 种。
建模的核心是模型,模型是现实的简化,模型是真实系统的做用,它提供了系统的设计蓝图。给软件系统建模,须要采用通用的符号语言,这种描述模型所使用的语言称为建模语言。下图完整地描述了 UML 所能描述的全部事物和关系。
类:对一组具备相同属性,方法,关系和语义的对象的描述。
接口:描述了一个类或构件的一个服务的操做集。它仅仅是定义了一组操做的规范,并无给出这组操做的具体实现(代码)。
用例:是对一组动做序列的描述,系统执行这些动做将产生一个对特定的参与者(Actor)有价值且可观察的结果。
包:是分组事物中最主要的,是 UML 中惟一的组织机制。
是一种拥有的关系,具备方向性。
- 若是一个类单方向的访问另外一个类,则称为单向关联(用一个箭头的实线表示),用带普通箭头的实线表示,箭头指向拥有者,
- 若是两个类对象能够互相访问,则称为双向关联(用两个箭头或不用箭头的实线表示),用不带箭头得实线表示,
- 一个对象能访问关联对象的数目叫作 "多重性"。
若是一个类的改动会影响到另外一个类,则两个类之间存在依赖关系,通常而言,依赖是单向的。
- 用带普通箭头的虚线表示,箭头指向被依赖者,
表示一个更泛化的元素和一个更具体的元素之间的关系,与继承是同一个概念。
- 用带三角箭头的实线表示 ,箭头指向父类,
类与接口的关系,类实现接口。
- 用带三角箭头的虚线表示,箭头指向父接口,
是总体与部分的关系。当某个实体聚合成另外一个实体时,该实体还能够是另外一个实体的部分。
- 用空心菱形的实线表示,菱形指向总体,箭头指向个体 ,
总体与部分的关系,组合比聚合更加严格。
当某个实体组合成另外一个实体时,两者具备相同的生命周期,例如手臂和腿之间存在的是组合关系。
用实心菱形的实线表示,菱形指向总体,箭头指向个体,
在 UML 2.0 的 13 种图形中,类图是使用频率最高的 UML 图之一。类图是描述系统中的类,以及各个类之间的关系的静态视图。可以让咱们在正确编写代码之前对系统有一个全面的认识。类图是一种模型类型,确切的说,是一种静态模型类型。类图表示类、接口和它们之间的协做关系,用于系统设计阶段。
类图用三个矩形表示,最上面的部分标识类的名称;中间的部分标识类的属性;最下面的部分标识类的方法,以下图所示:
类与类之间的关系主要有六种:关联、聚合、组合、继承[泛化]、实现和依赖,这六种关系的箭头表示以下:
关联关系是类与类之间最经常使用的一种关系,表示一类对象与另外一类对象之间有联系。组合、聚合也属于关联关系,只是关联关系的类间关系比其余两种要弱。
关联关系有四种:双向关联、单向关联、自关联、多重数关联。例如:汽车和司机,一辆汽车对应特定的司机,一个司机也能够开多辆车。
在多重性关系中,能够直接在关联直线上增长一个数字,表示与之对应的另外一个类的对象的个数。
大多数状况下,依赖关系体如今某个类的方法使用另外一个类的对象做为参数。依赖关系是一种“使用”关系,特定事物的改变有可能会影响到使用该事物的其余事物,在须要表示一个事物使用另外一个事物时使用依赖关系。
例如:汽车依赖汽油,若是没有汽油,汽车将没法行驶。
继承关系中,子类继承父类的全部功能,父类所具备的属性、方法,子类应该都有。子类中除了与父类一致的信息之外,还包括额外的信息。
例如:公交车、出租车和小轿车都是汽车,他们都有名称,而且都能在路上行驶。其类图以下:
接口(包括抽象类)是方法的集合,在实现关系中,类实现了接口,类中的方法实现了接口声明的全部方法。
例如:汽车和轮船都是交通工具,而交通工具只是一个可移动工具的抽象概念,船和车实现了具体移动的功能。
聚合关系也表示类之间总体与部分的关系,成员对象是总体对象的一部分,可是成员对象能够脱离总体对象独立存在。
例如:公交车司机和工衣、工帽是总体与部分的关系,可是能够分开,工衣、工帽能够穿在别的司机身上,公交司机也能够穿别的工衣、工帽。
组合关系表示类之间总体与部分的关系,总体和部分有一致的生存期。一旦总体对象不存在,部分对象也将不存在,是同生共死的关系。
例如:人由头部和身体组成,二者不可分割,共同存在。
这六种类关系中,组合、聚合和关联的代码结构同样,能够从关系的强弱来理解,各种关系从强到弱依次是:继承→实现→组合→聚合→关联→依赖。
UML 类图是面向对象设计的辅助工具,但并不是是必须工具,因此咱们把它做为架构师软技能来说解。
类关系记忆技巧
箭头方向,从子类指向父类
记忆技巧:
一、定义子类是须要经过 extends 关键字指定父类;
二、子类必定是知道父类定义的,但父类并不知道子类的定义;
三、只有知道对方信息时才能指向对方;
四、因此箭头的方向是从子类指向父类。
继承/实现,用线条链接两个类
记忆技巧:
一、空心三角箭头表示继承或实现;
二、实线表示继承,是 is-a 的关系,表示扩展,不虚,很结实;
三、虚线表示实现,虚线表明 "虚" 无实体。
关联依赖,用线条链接两个类
记忆技巧:
一、虚线表示依赖关系:临时用一下,若即若离,虚无缥缈,如有若无;表示一种使用关系,一个类须要借助另外一类来实现功能;通常是一个类将另外一个类做为参数使用,或做为返回值。
二、实线表示关联关系:关系稳定,实打实的关系,铁哥们;表示一个类对象和另外一个类对象有关联;一般是一个类中有另外一个类对象做为属性。
组合聚合,用菱形表示
记忆技巧:
一、菱形就是像是一个盛东西的器皿(好比盘子);
二、聚合:空心菱形,表明空器皿里能够放不少相同的东西,汇集在一块儿(箭头方向所指的类);总体和局部的关系,二者有独立的生命周期,是 has-a 的关系;弱关系,消极的词:弱-空;
三、组合:实心菱形,表明器皿里已经有实体结构的存在,生死与共;总体与局部的关系,和聚合关系对比,关系更增强烈;二者具备相同的生命周期,contains-a 的关系;强关系,积极的词:强-满。
注意:UML 类关系图中,没有实心箭头
下面这张图是来自《大话设计模式》这本书中,对动物衍生关系描述的类图。这个图很是有技术含量也很是经典,你们能够和我一块儿来好好理解一下。
时序图描述对象之间消息的发送顺序,强调时间顺序。时序图是一个二维图,横轴表示对象,纵轴表
示时间,消息在各对象之间横向传递,依照时间顺序纵向排列。用箭头表示消息、用竖虚线表示对象生命线
时序图的做用
一、展现对象之间交互的顺序。将交互行为建模为消息传递,经过描述消息是如何在对象间发送和接收的来动态展现对象之间的交互;
二、相对于其余 UML 图,时序图更强调交互的时间顺序;
三、能够直观的描述并发进程。
时序图组成元素
角色(Actor)
系统角色,能够是人、机器、其余系统、子系统;在时序图中用表示。
对象(Object)
三种命名方式
一、包括对象名和类名,例如:直播课时:课时,在时序图中,用 "对象:类" 表示;
二、只显示类名,即表示它是一个匿名对象,例如:课程,在时序图中,用 ":类" 表示;
三、只显示对象名不显示类名,例如:讲师;在时序图中,用 "对象" 表示;
命名方式的选择
一、三种命名方式都可,哪一种最容易让阅读该时序图的人理解,就选择哪一种。
对象的排列顺序
一、对象的左右顺序并不重要,可是为了做图清晰整洁,一般应遵循如下两个原则:把交互频繁的对象尽量的靠拢;把初始化整个交互活动的对象放置在最左端。
生命线(Lifeline)
在时序图中表示为从对象图标向下延伸的一条虚线,表示对象存在的时间。
控制焦点(Focus of Control)又称为激活期,
表示时间段的符号,在这个时间段内对象将执行相应的操做。能够理解为 Java 语言中一对大括号{ }中的内容;用小矩形表示。
消息(Message)
消息通常分为同步消息(Synchronous Message),异步消息(Asynchronous Message)和返回消息(Return Message)。
一、消息的发送者把控制传递给消息的接收者,而后中止活动,等待消息的接收者放弃或者返回控制。用来表示同步的意义;
二、消息发送者经过消息把信号传递给消息的接收者,而后继续本身的活动,不等待接受者返回消息或者控制。异步消息的接收者和发送者是并发工做的。
三、返回消息表示从过程调用返回。
自关联消息
表示方法的自身调用或者一个对象内的一个方法调用另一个方法。
组合片断
组合片断用来解决交互执行的条件和方式,它容许在序列图中直接表示逻辑组件,用于经过指定条件或子进程的应用区域,为任何生命线的任何部分定义特殊条件和子进程。
组合片断共有 13 种,名称及含义以下:
片断类型 | 说明 |
---|---|
Opt | 选项: 包含一个可能发生或可能不发生的序列,能够在临界中指定序列发生的条件。 |
Alt | 抉择: 包含一个片断列表,这些片断包含备选消息序列,在任何场合下只发生一个序列。 能够在每一个片断中设置一个临界来指示该片断能够运行的条件,else 的临界指示其余任何临界都不为True 时应运行的片断。若是全部临界都为False 而且没有else ,则不执行任何片断。 |
Loop | 循环: 片断重复必定次数,能够在临界中指示片断重复的条件。Loop 组合片断具备 "Min" 和 "Max" 属性,它们指示片断能够重复的最小和最大次数,默认值是无限制。 |
Break | 中断: 若是执行此片断,则放弃序列的其他部分。可使用临界来指示发生中断的条件。 |
Par | 并行: 并行处理,片断中的事件能够交错进行。 |
Critical | 关键: 用在 Par 或 Seq 片断中,指示此片断中的消息不得与其余消息交错。 |
Seq | 弱顺序: 有两个或更多操做数片断,这些片断必须按给定顺序发生。若是消息涉及的生命线不一样,来自不一样片断的消息可能会并行交错 |
Strict | 强顺序: 有两个或更多操做数片断,这些片断必须按给定顺序发生。 |
Consider | 考虑: 指定此片断描述的消息列表,其余消息可发生在运行的系统中,但对此描述来讲意义不大。 在"Messages"属性中键入该列表。 |
Ignore | 忽略: 此片断未描述的消息列表,这些消息可发生在运行的系统中,但对此描述来讲意义不大。 在"Messages"属性中键入该列表。 |
Assert | 断言: 操做数片断指定惟一有效的序列。一般用在 Consider 或 Ignore 片断中 |
Neg | 否认: 此片断中显示的序列不得发生。一般用在Consider 或Ignore 片断中。 |
Ref | 引用: 引用其余地方定义的组合片断 |
包含一个可能发生或不发生的序列
用来指明在两个或更多的消息序列之间的互斥的选择,至关于经典的if..else..
抉择在任何场合下只发生一个序列。能够在每一个片断中设置一个临界来指示该片断能够运行的条件。else 的临界指示其余任何临界都不为True 时应运行的片断。若是全部临界都为False 而且没有else,则不执行任何片断。
片断重复必定次数,能够在临界中指示片断重复的条件。
同时进行得两个片断
一、划清边界,识别交互的语境;
二、将所要绘制的交互场景中的角色以及对象梳理出来;
三、从触发整个交互的某个消息开始,在生命线之间从上到下依次画出全部消息,并注明 每一个消息的特性(如参数等)。