设计模式与UML
2022-05-13 09:36:26 2 举报
AI智能生成
登录查看完整内容
设计模式与UML
作者其他创作
大纲/内容
UML(Unified Modeling Language Diagram)图
属于结构图
常被用于描述一个系统的静态结构
是什么
关键字:可视化、图形化、建模语言
* 通用的、图形化、可视化的建模语言,统一或标准建模语言(不是可视化的编程语言/程序设计语言) * 支持模型化和软件开发的图形化语言 * 面向对象分析与设计的一种标准表示 * 用于对软件进行可视化描述
逻辑视图:又叫设计视图,它表示了设计模型在架构方面具有重要意义的部分,即类。子系统、包和用例实现的子集进程视图:可执行线程和进程作为活动类的建模,它是逻辑视图的一次执行实例,描述了并发与同步结构。实现视图:对组成基于系统的物理代码的文件和构建进行建模、用例视图:最基本的需求分析模型
UML是什么
* UML不是一种可视化的程序设计语言,而是一种可视化的建模语言。 * UML不是过程也不是方法,但允许每一种过程和方法使用它。 * 简单、并且可扩展,不因扩展而修改核心 * 属于建模语言的规范说明,是面向对象分析与设计的一种标准表示 * 支持高级概念(如架构、框架、模式、组件等),强调重用并可重用 * 可集成最好的软件工程实践经验
UML的特征:
为软件所有阶段提供模型化和可视化支持。包括由需求分析到规格,到构造和配置
UML描述了系统的静态结构和动态行为,它将系统描述为一些独立的相互作用的对象,构成为外界提供一定功能的模型结构
* 静态结构:定义了系统中的重要对象的属性和服务,以及这些对象之间的相互关系 * 动态行为:定义了对象的时间特性和对象为完成目标而相互进行通信的机制。
UML的作用
* UML并没有定义一种标准的开发过程,但它比较适用于迭代式的开发过程。 * UML适用于各种软件开发方法、软件生命周期的各个阶段、各种应用领域以及各种开发工具
UML的适用场景与使用的开发过程
UML图的分类
没有控制图,没有继承图
图解UML图的分类
类(Class)的UML图
接口(Interface)的UML图
展现了一组类。接口、协作和它们之间的关系
给出了系统的静态设计视图
包含主动类的类图给出了系统的静态过程视图
类图(最常见的图)
图示
总览图
Dependency
依赖关系(Dependency)的UML图
如果A类中某个方法的参数是用B类声明的对象或某个方法返回的数据类型是B类对象,那么A和B的关系是依赖关系,称A依赖于B。
一个事物发生变化影响另一个事物表示两个或多个模型元素之间语义上的连接关系描述了一个类的变化对依赖于它的类产生影响的情况是一种使用关系即一个类的实现需要另一个类的协助。逻辑上能用\"use a\"表示。尽量不要使用双向依赖。
依赖关系
局部变量、方法的参数和静态方法的调用。
依赖关系(Dependency)的UML图 : ClassRoom依赖于Student的UML图
依赖关系(Dependency)
代码体现
虚线箭头箭头指向被使用者一条虚线+箭头
UML绘图方式
Generalization
继承关系/泛化关系(Generalization)的UML图
如果一个类是另一个类的子类,那么UML通过使用一个实线连接两个类的UML图来表示二者之间的继承关系,
实线的起始端是子类的UML图,终点端是父类的UML图,但终点端使用一个空心的三角形表示实线的结束。
特殊/一般关系描述类的一般关系与具体之间的关系描述的“is a kind of”的关系这种关系就是面向对象语言中的继承关系逻辑上可以用\"is a\"表示。若类B除具有类A的全部特性外还可以定义新的特性,以及替换类A的部分特性那么类A与类B之间是泛化关系A是B和C的父类,B,C具有公共类(父类)A说明A是B,C的一般化(概括,泛化)
子类继承父类
实线空心三角箭头箭头指向父类一条实线+空心箭头。
泛化关系(Generalization)(继承关系)
Association
关联关系(Association)的UML图
关联关系
如果A类中成员变量是用B类声明的对象,那么A和B的关系是关联关系,称A关联于B或A组合了B。
描述了类的结构之间的关系描述一组链,链是对象之间的连接表示的是一个事物的对象与另一个事物的对象之间的语义上连接是整体与部分的关系逻辑上能用\"has a\"表示。两个类或类与接口之间的强依赖关系在用例图中,执行者和用例之间进行交互相关之间的关系用一根直线来表示(关联关系)
成员变量
关联关系(Association)的UML图: Circular类关联于Circle类的UML图
实线无箭头
关联关系(Association)
Aggregation
整体与部分生命周期不同各自独立,可分离整体与部分的关系拥有关系部分能脱离整体而独立存在逻辑上能用\"has a\"表示。一个较大的整体类包含一个或多个部分类通常在定义一个整体类后再去分析这个整体类的组成结构从而找出一些成员类该整体与成员类之间就是聚合关系
(轮子和车)(计算机与CPU)(公司与员工的关系)
成员变量-聚合关系(Aggregation)(关联关系的特例)
实线菱形空心箭头一条实线+空心菱形
UML绘图关系
聚合关系(Aggregation)(关联关系的特例)
Composition
整体与部分生命周期相同语义更强的聚合是整体与部分的关系部分不能脱离整体而独立存在逻辑上能用\"has a\"表示。
(公司与部门)
成员变量-组合关系(Composition)(关联关系的特例)
实线菱形实心箭头span style=\
组合关系(Composition)(关联关系的特例)
Realization
实现关系(Realization)的UML图
和泛化关系相似逻辑上也是用\"is a\"表示。区别:实现关系继承一个抽象类(abstract、interface)而泛化关系继承一个具体类。接口和类之间的关系将一个模型关系与另一种模型关系连接起来从而说明和其实现之间的关系将一个类或多个类实现一个接口
实现接口或继承某个抽象类
封闭空箭头虚线 箭头指向接口一条虚线+空心箭头
实现关系(Realization)
UML-类图关系(类与类之间的关系)
双向关联,一条实线或一条实线+两个箭头;
单向关联,一条实线+一个箭头。
子主题
自身关联:在单例模式中可以看到
关联的多元性图示:
其他关联关系
(类模型) UML中类之间的六大关系
一组对象及它们之间的关系展现了一组对象以及它们之间的关系描述了在类图中所建立的事物实例的静态快照。和类图一样,这些图给出系统的静态设计视图或静态进程视图,但它们是从真实案例或原型案例的角度建立的。
对象图
一个封装的类和它的接口
描述构件的结构和连接。
构件是一个模块化元素,隐藏了内部的实现,对外提供一组外部接口
构件图
软硬件之间映射
描述在各个结点的部署情况
展现了对运行时的处理结点,以及在其中生存的构件的配置。
部署图给出了架构的静态部署视图,通常一个结点包含一个或多个部署图。
部署图
系统的物理结构
NA
制品图
由模型本身分解而成的组织单元,以及它们之间的依赖关系
对语义联系紧密的事物进行分组
包图
显示结构化类的内部结构
组合结构图 复合结构图
组合结构图复合结构图
静态图(结构图)
展现了一组用例,参与者(特殊的类)以及它们之间的关系描述了系统与外部系统以及用户之间的交互它给出系统的静态用例视图,在对系统的行为进行组织和建模时候非常重要。系统与外部参与者的交互用于描述用户与系统功能单元之间的关系,它展示了一个外部用户能够观察到的系统功能的模型图。
用例图图示
由参与者(Actor)、用例图(Use Case)、系统边界、箭头组成,用画图的方法来完成。用例描述:用来详细描述用例图中每个用例,用文本文档来完成,以及由箭头所组成的所有关系,包括泛化,包括,扩展等。
什么是用例图?
* 获取需求,帮助开发团队以一种可视化的方式理解系统的功能需求,包括基于基本流程的“角色”关系 * 指导测试 * 在整个过程中的其他工作流起到指导作用。
用例图有什么作用?
UML-用例图与用例图关系
其中这个提取出来的公共用例称为抽象用例,而把原始用例称为基本用例或基础用例系:当可以从两个或两个以上的用例中提取公共行为时,应该使用包含关系来表示它们。使用包含用例来封装一组跨越多个用例的相似动作(行为片段),以便多个基用例复用,做基用例时,必然会做它所包含的事件。eg:取款机的使用,包括了“识别客户”+“验证账号”,而且是必须要做的哦。包含用例是必选的,如果缺少包含用例,基用例就不完整了
包含关系(include)
箭头指向的用例为被包含的用例箭头出发的用例为基用例
几个用例可以提取他们共用的用例作为子用例,使其成为自己行为的一部分,因为子用例被提出,基用例并非一个完整的用例,所以include关系中的基用例必须和子用例一起使用才够完整,子用例也必然被执行。由基用例指向子用例,比如几个用例都要用到登录子用例,登录作为子用例没有它的参与,其他用例也无法执行,这就是包含关系。
如果一个用例很明显地混合了两种或两种以上的不同场景,即根据情况可能会发生多种分支,则可以将这个用例分为一个基本用例和一或多个扩展用例,这样描述可能更清晰将基用例中一段相对独立并且可选的动作,用扩展用例加以封装,再让它从基用例中声明的扩展点上进行扩展,从而使用基用例行为更简练和目标更集中,做基事件之后,我们能做扩展事件,也可能不做。
扩展关系(Extend)
箭头指向的用例为被扩展的用例箭头出发的用例为基用例
当某个新用例在原来的用例基础上增加了新的步骤序列,则原来用例被称为基用例,这种关系称为扩展关系,可以这样理解这里的基用例是一个完整的用例,即使没有子用例的参与,也可以完成一个完整的功能,只有当扩展点被激活时,子用例才会被执行。由子用例指向基用例,比如说充值金额查询用例中有导出Excel子用例,离开子用例不影响充值金额查询的功能,这就是扩展关系。
当多个用例共同拥有一种类似的结构和行为的时候,可以将它们的共性抽象为父用例,其他的用例作为泛化关系中的子用例,在用例的泛化关系中,子用例是父用例的一种特殊形式,子用例继承了父用例所有的结构,行为和关系。泛化和类中的泛化概念是一样的哦常存在于父类与子类,父接口和子接口之间。子用例继承父用例的行为和含义,还可以增加或覆盖父用例的行为子用例可以出现在任何父用例出现的位置(父和子均有具体的用例)
父用例是“订票”,其两个子用例分别是,电话订票和网上订票、这两个用例都继承了父用例的行为,并添加了自己的行为。一般和特殊关系发出箭头的一方代表特殊一方箭头指向的一方代表一般一方
泛化关系(Generalization)
UML-用例图关系
span style=\
父子关系
(没有组合关系的时候,选择聚合关系)
六种关系的耦合度大小是:泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖
泛化和实现体现了逻辑上的\"is a\"的关系,组合、聚合和关联体现了逻辑上的\"has a\"的关系,“依赖”体现了逻辑上的\"use a\"的关系。
总结
用例图
状态转换变迁描述了一个特定对象的所有可能状态以及由于各种事件的发生而引起的状态之间的转移。描述一个状态机,它由状态,转移,事件和活动组成。给出了对象的动态视图。描述对象状态的转移对于接口、类或协作的行为建模尤为重要,而且它强调事件导致的对象行为,这非常助于对反应式系统建模。
状态图(状态机图)
类似于流程图,并行行为描述过程行为与并行行为
活动图(流程图)(泳道图)
图示活动图(流程图)(泳道图)
强调按照时间顺序,通常由左往右分层排列各个对象执行者角色-控制类-用户接口-业务层-后台数据库强调时序,强调消息的时间次序的交互图。
图示顺序图
顺序图
强调消息收发对象的结构组织也是一种交互图,它强调收发信息的对象或参与者的结构组织。强调对象之间的组织结构(关系)
图示通信图(协作图)
通信图(协作图)
强调实际时间也是一种交互图,展现了消息跨越不同对象或角色的实际时间,而不仅仅只是关心消息的相对顺序。重点在于给出消息经过不同对象的具体时间
定时图
属于一种顺序图与活动图的混合
图示交互概览图
交互概览图
动态图(行为图)
UML2.0交互图
这些事物是UML模型中面向对象的基本建筑块,他们在模型中属于静态部分,代表物理上或概念上的元素。
结构事物主要包括7种,分别是类、接口、用例、协作、活动类、组件和节点 。
类是具有相同属性、相同方法、相同语义和相同关系的一组对象的集合。一个类可以实现一个或多个接口。在UML图中,类用包括类名、属性和方法的矩形来表示。
类(Class)
接口是指类或组件提供的、可以完成特定功能的一组操作的集合。换句话说,接口描述了类或组件对外的、可见的动作。通常,一个类实现一个或多个接口。在UML图中,接口通常用一个圆形来表示。
接口(Interface)
用例定义了系统执行的一组操作,对特定的用户产生可以观察的结果。在UML图中,用例通常用一个实线椭圆来表示。
用例(Use Case)
协作定义了交互的操作,表示一些角色和其他元素一起工作,提供一些合作的动作。一个给定的类可能是几个协作的组成部分,这些协作代表构成系统的模式的实现。在UML图中,协作通常用一个虚线椭圆表示。
协作(Collaboration)
活动类是指对象有一个或多个线程或进程的类。活动类和类相似,只是它的对象代表的元素的行为和其他的元素同时存在。在UML图中,活动类的表示方法和普通类的表示方法相似,也是使用一个矩形,只是最外面的边框使用粗线。
活动类(Active Class)
组件是物理上可替换的,实现了一个或多个接口的系统元素。在UML图中,组件的表示图形比较复杂。
组件/构件(Component)
节点(Node)
结构事物
行为事物也称动作事物,是UML模型中的动态部分,代表时间和空间上的动作。 它们是UML模型中最基本的两个动态事物元素,通常和其他的结构元素、主要的类、对象连接在一起。
交互是在特定上下文中的一组对象,为共同完成一定的任务而进行的一系列消息交换所组成的动作。交互包括消息、动作序列(消息产生的动作)、对象之间的连接。在 UML图中,交互的消息通常画成带箭头的直线。
交互(Interaction)
状态机是对象的一个或多个状态的集合。在UML图中,状态机通常用一个圆角矩形来表示。
状态机(State Machine)
行为事物(动作事物)
组织事物也称分组事物,是UML模型中组织的部分可以吧它看做一个个的盒子,每个盒子里面的对象关系相对复杂,而盒子与盒子之间的关系相对简单。组织事物只有一种,成为包。
包是一种有组织地将一系列元素分组的机制。包与组件最大的区别在于,包纯粹是一种概念上的东西,仅仅窜在于开发阶段结束之前,而组件是一种物理元素,存在于运行时。在UML图中,包通常表示为一个类似文件夹的符号。
包(Package)
组织事物(分组事物)
辅助事物也称注释事物,属于这一类的只有注释。
注释就是UML模型的解释部分。在UML图中一般表示为折起一角的矩形。
注释(Annatation)
辅助事物(注释事物)
UML中的事物
在实际项目中,对于核心业务,一定要设计好业务流程,在分析业务的过程中,除了业务流程图,还可能用到活动图,序列图,用例图等。通过视图可以帮你理解业务,建模业务,也便于同事之间的沟通与交流,方便工作交接。一定要注意业务,重视建模UML入门:活动图+用例图+序列图。UML已经成为架构师的必备技能了
架构师与UML
UML
定义良好
易于表达
功能强大
普遍适用
一种建模语言
统一
标准
可视化
为面向对象软件设计,提供建模语言
融入软件工程领域的新思想、新方法和新技术
支持面向对象的分析与设计
以体系结构为中心
以用例为驱动
从需求分析开始的软件设计开发全过程
作用域
定义
类图
组合结构图
状态图
活动图
通信图
系统动态视图
对象+参与者+消息
交互图
UML2.0的14种图
常用的UML图
最基本构成元素
代表性的成分抽象
事物
把事物紧密联系在一起
关系
两者的可视化表示
图
UML模型图的构成
关联
依赖
泛化
聚合
组合
实现
类间关系
包含
扩展
用例间关系
* 系统流程图(可行性研究阶段) * 数据流图 (可行性研究、需求分析阶段) * E-R图(需求分析、概念设计阶段) * 状态转换图(需求分析阶段、总体设计) * 程序流程图 (详细设计阶段用)
五种图?作用?哪个软件生命周期的哪个阶段使用?
需求分析阶段的三种模型
需求分析阶段的三种模型(分别用什么图来描述或叫对应什么图)
* 一种图形化技术 * 描绘信息流和数据从输入移动到输出的过程中所经受的变换 * 描绘数据在软件中流动和被动处理的逻辑过程,也是分析员和用户之间极好的通信工具;
数据流图
* 关于数据的信息的集合 * 对数据流图中包含的所有元素的定义的集合。 * 在软件分析和设计过程中给人提供关于数据的描述信息。
数据字典
通过描绘系统的状态及引起系统状态转换的事件,来表示系统的行为指明了作为特殊事件的结果系统将做哪些动作
状态转换图
什么是数据流图?什么是数据字典?什么是状态转换图?
数据流图(A ) 和数据字典(B )共同构成系统的逻辑模型,
* 没有A,B就不严格, * 没有A,B难于发挥作用。 * 只有A和对A中每个元素的精确定义放在一起,才能共同构成系统的规格说明。
数据流图和数据字典的关系?
初态一张状态图中只能有一个初态;
中间态
终态可以有0个至多个
状态转换图有哪几种状态?每种状态有什么特征?
Data Flow Diagram DFD,从数据传递和加工角度,以图形方式来表达系统的逻辑功能、数据在系统内部的逻辑流向和逻辑变换过程,
是结构化系统分析方法的主要表达工具以及用于表示软件模型的一种图示方法。
什么是数据流图
至少一个输入和一个输出
数据流图中至少有几个输入流和输出流?
数据流、加工、数据存储和外部实体
数据在系统内传播的路径由一组成分固定的数据组成eg:订票单由旅客姓名+年龄+单位+身份证号+日期+目的地等数据项组成由于数据流是流动中的数据,所以必须有流向,除了与数据存储之间的数据流不用命名外,数据流应该用名词或名词短语命名。
数据流
系统外的实体,称做外部项他们存在于环境之中,与系统有信息交流,从源点到系统的信息叫系统的输入从系统到终点的信息叫系统的输出。可以有编号,以“S”开头同一个端点,可以是人或其他系统,为什么要在DFD中引入源点和终点?便于理解系统
源点和终点(端点)
对数据进行处理的单元,接受一定的数据输入,对其进行处理,并产生输出
对数据的加工(处理)
表示信息的静态存储,可以代表文件,文件的一部分,数据库的元素等
数据存储
数据流图的基本组成部分包括(数据流程图中的主要元素)
数据流图介绍
以下关于数据流图的说法错误的是( C )。
A. 数据流图舍去了具体的物质,只剩下数据的流动、加工处理和存储B. 数据流图是用作结构化分析的一种工具C. 传统的数据流图中主要由加工、数据源点/终点、数据流、控制流、数据存储组成D. 数据流图的绘制采用自上向下、逐层分解的方法
DFD中的“→”代表数据流 DFD中的“○”代表 处理 DFD中的“_”代表 文件
“→”箭头
加工
“ ○”圆或椭圆
“=”双杠(带一边开口,一边闭合)
数据的源头或终点
“□”方框
图形符号 对应 数据流程图中的主要元素
DFD在软件工程中表示数据流图
数据流图的四种基本图形符号
注意它的产生时期是:需求分析阶段
状态转换图有的哪些基本符号,哪几种状态,要会画
数据流图、数据字典、状态转换图
详细设计阶段要画程序流程图和盒图(N-S图)
(1)什么时候画盒图?程序流程图什么阶段要用?
* 功能域明确,可以从盒图上一眼就看出来; * 很容易确定局部和全程数据的作用域; * 不可能任意转移控制; * 很容易表现嵌套关系,也可以表示模块的层次结构;
(2)盒图有什么特点?
(3)N-S图(盒图)是怎样画的?N-S图的基本符号和表示的结构
盒图(N-S图)介绍
* 程序流程图?基本符号?判断,循环(上界,下界),分支。路径是怎么确定的? * 程序流程图 ,判断,循环(上下界怎么话),分支(记符号),怎么画,路径那么确定
循环上下界限
多分支
程序流程图介绍
软件结构怎样画?
数据流图如何映射成软件结构图
软件结构图
五种图
* Design Pattern * 前人的经验总结,它使人们可以方便地复用成功的软件设计 * 是一套被反复使用的,多数人知晓的、经过分类编目的、代码设计经验的总结。 * 设计模式,包括模型名称、问题、目的、解决方案、效果、实例代码和相关设计模式等基本要素 * 如果说编程比喻成战争的话,那么设计模式就是孙子兵法
什么是设计模式?
为了可重用性代码、让代码更容易被他人理解,保证代码的可靠性
有什么作用呢?
编译时确定
静态关系
处理类和子类之间的关系,关系通过继承时建立,编译时确定
类模式
运行时确定
动态关系
处理对象之间的关系,运行时刻变化
对象模式
按照处理范围分类
创建对象
单例模式的基本知识
如何手写单例模式?
单例模式的使用场景?
单例模式如何做相关的实现?
什么是懒汉模式?什么是饿汉模式?
单例模式
工厂模式抽象工厂模式原型模式单例模式构建器模式
创建型模型
更大的结构
适配器模式桥接模式组合模式装饰模式外观模式享元模式代理模式
结构型模型
交互与职责分配
责任链设计模式的思想很简单
按照链的顺序执⾏⼀个个处理⽅法,链上的每⼀个任务都持有它后⾯那个任务的对象引⽤,以⽅便⾃⼰这段执⾏完成之后,调⽤其后⾯的处理逻辑。
public interface Task { public void run();}public class Task1 implements Task { private Task task; public Task1() { } public Task1(Task task) { this.task = task; } @Override public void run() { System.out.println(\"task1 is run\"); if (task != null) { task.run(); } }}public class Task2 implements Task { private Task task; public Task2() { } public Task2(Task task) { this.task = task; } @Override public void run() { System.out.println(\"task2 is run\"); System.out.println(\"task2 is run\"); if (task != null) { task.run(); } }}public class Task3 implements Task { private Task task; public Task3() { } public Task3(Task task) { this.task = task; } @Override public void run() { System.out.println(\"task3 is run\"); if (task != null) { task.run(); } }}
以上代码是模拟了三个任务类,它们都实现了统⼀个接⼝,并且它们都⼀个构造函数,可以在它们初始化的时候就持有另⼀个任务类的对象引⽤,以⽅便该任务调⽤。
public class LiabilityChain { public void runChain() { Task task3 = new Task1(); Task task2 = new Task2(task3); Task task1 = new Task3(task2); task1.run(); }}
这个和服务器的过滤器有点类似,过滤器的实现也都是实现了同⼀个接⼝Filter。
public class ChainTest { public static void main(String[] args) { LiabilityChain chain = new LiabilityChain(); chain.runChain(); }}
上⾯这段代码就是⼀个任务链对象,它要做的事情很简单,就是将所有要执⾏的任务都按照指定的顺序串联起来。
当我们获取到责任链对象之后,调⽤其⽅法,得到以下运⾏结果:
以上是⼀个责任链的简单的实现,如果想要深⼊理解其思想,建议去观察⼀个过滤器链的执⾏源码。
责任链设计模式的简单的实现
责任链模式
职责链模式命令模式解释器模式迭代器模式中介者模式备忘录模式观察者模式状态模式策略模式模板方法模式访问者模式
行为型模型
按照目的和用途分类
设计模式的分类(Java)
适配者模式
讲讲你知道的设计模式?+1
各个设计模式各有什么特点?
什么时候去使用这些设计模式?
抽象工厂模式和简单工厂模式有什么区别?
Spring源码中有哪些设计模式?
讲解下观察者模式?
设计模式与数据库三大范式?
常见问题
设计模式
UML与设计模式
0 条评论
回复 删除
下一页