一文看懂很多流程图的实现
小tips:本文需要你有一些面向对象程序的设计的知识会更好理解一些
假如你不懂什么是程序的基本流程,或许我之前的知乎可以帮到你:链接在这
流程图入门
流程图的作用
流程图(Flow Chart),顾名思义,就是用来直观地描述一个工作过程的具体步骤图,它使用图形表示流程思路,是一种极好的方法。它在一些技术设计、工作步骤及商业简报等领域应用较为广泛,也可以称之为输入-输出图。它通常用一些图框来表示各种类型的操作,在框内写出各个步骤,然后用带箭头的线把它们连接起来,以表示执行的先后顺序,用图形表示执行步骤,十分直观形象,易于理解。
流程图标准图例

.jpg)
流程图的三大结构
顺序结构
.png)
选择结构
.png)
循环结构
.png)
画流程图的规范
绘制流程图时,应该遵循从左到右、从上到下。一个流程从开始符开始,以结束符结束。开始符只能出现一次,而结束符可出现多次。若流程足够清晰,可省略开始、结束符号。
菱形为判断符号,必须要有“是和否(或Y和N)”两种处理结果,意思是说,菱形判断框一定需要有两条箭头流出;且判断符号的上下端流入流出一般用“是(或Y)”,左右端流入流出用“否(或Y)”。
.jpg)
同一流程图内,符号大小需要保持一致,同时连接线不能交叉,连接线不能无故弯曲。
流程处理关系为并行关系的,需要将流程放在同一高度。
处理流程须以单一入口和单一出口绘制,同一路径的指示箭头应只有一个。
.jpg)
同一路径的指示箭头应只有一个。
.jpg)
UML(统一建模语言)
什么是UML
面向对象软件开发需要经过OOA(面向对象分析)、OOD(面向对象设计)和OOP(面向对象编程),UML就是这种用于描述记录OOA和OOD结果的符号表达式。
本文以下两个流程图均是用MarkDown语法生成,如有兴趣请访问链接:百度Typora怎么表示流程图
graph LR
A[OMT] -->B(UML 0.9)
Booch[Booch] -->B(UML 0.9)
OOSE[OOSE] -->B
B --> C[UML1.1]
C --> D[UML1.4]
D --> F[UML2.0]
G[UML的发展历史]
UML2.0
graph LR
A[UML的发展历史] --> B[静态图]
A[UML的发展历史] --> C[动态图]
B --> 用例图
B --> 类图
B --> 包图
B --> 组件图
B --> 对象图
B --> 部署图
B --> 符合结构图
C --> 顺序图
C --> 通信图
C --> 状态机图
C --> 活动图
C --> 定时图
C --> 交互概观图
虽然有那么多图,但是很少会有一个软件系统在分析、设计阶段对每个细节都使用13种UML图形来表示。
不要把UML表示法当成一种负担,而应该把它当成一种工具,一种用于描述、记录软件分析设计的工具。
静态图
用例图
用例图用于描述系统提供的系列功能,用例图主要目的是帮助开发团队以一种可视化的方式理解系统的需求功能,用例图对系统的实现不做任何说明,仅仅是系统功能的描述。用例图主要在需求分析阶段使用。
用例图包括用例(以椭圆表示)、角色(人形符号表示)
.png)
类图
类图表示系统种应该包含哪些实体,各实体之间如何关联;显示了系统的静态结构,类在类图上使用包含三个部分的矩形来形容。最上面的部分显示类的名称,中间部分包含类的属性,最下面的部分包含类的方法。+表示public(公共的),-表示private(私有的),#表示protected(受保护的)。
.png)
接口图表示系统中的接口,最上面的部分显示接口的名称,下面的部分包含类的方法,与类图较为相似。
%E7%BB%84%E4%BB%B6%E5%9B%BE.png)
关联
他体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的、关联可以是单向、双向的;表现在代码层面,为被关联类B以类属性的形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量;
.png)
聚合
聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;比如计算机与CPU、公司与员工的关系等;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;
%E8%81%9A%E5%90%88.png)
组合
组合也是关联关系的一种特例,他体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合;他同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束;比如你和你的大脑;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;
.png)
泛化(继承)
指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系;在Java中此类关系通过关键字extends明确标识
.png)
依赖
可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、、临时性的、非常弱的,但是B类的变化会影响到A;比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖;表现在代码层面,为类B作为参数被类A在某个method方法中使用;
.png)
实现
指的是一个class类实现interface接口(可以是多个)的功能;实现是类与接口之间最常见的关系;在Java中此类关系通过关键字implements明确标识
.png)
组件图
对于现代的大型应用程序来说,通常不只是单独一个类或单独一组类能完成,通常会有一个或多个可部署的组件组成。
组件图提供系统的物理视图,用途是显示系统中的软件对其他软件组件的依赖关系。
组件图通常包含组件、接口和Port等图元。
圆形代表着接口,
正方形代表端口(内部和外部通过这个正方形来进行通信)
所需的接口符号末端只有一个半圆(也称为套接字)表示组件所需的接口(在这两种情况下,接口的名称都放在接口符号本身附近)。
右上角那个符号代表着它是一个组件%E7%BB%84%E4%BB%B6%E5%9B%BE.png)
你可以看到下图的组件中包含很多小组件,这就说明了组件图可以用来表示组件的具体实现过程。
%E7%BB%84%E4%BB%B6%E5%9B%BE.png)
%E7%BB%84%E4%BB%B6%E5%9B%BE.png)
也可以用来表示在系统中各组件之间的关系。
%E7%BB%84%E4%BB%B6%E5%9B%BE.png)
用一句很官方的话来说:
组件图可以在一个非常高的层次上显示,仅显示系统中粗粒度的组件,也可以在组件包层次上显示。
部署图
现代的软件工程早已超出早期的单机程序,整个软件系统可能是跨国家、跨地区的分布式软件。
动态图部署图用于描述软件系统如何部署到硬件环境中,它的用途是显示软件系统不同的组件如何在何处物理运行并如何通信。部署图只是相比与组件图多了一个节点而已。
%E9%83%A8%E7%BD%B2%E5%9B%BE.png)
从此图可以看出,整个应用分为5个组件:学生,管理员,应用持久层,学生数据库,UI界面组件。部署图精密地反映出了他们之间的依赖关系。其中普通客户端无需部署,管理员客户机上需要部署UI界面。
动态图
顺序图
顺序图显示具体用例的详细流程,并且显示流程中不同对象之间的调用关系,同事还可以很详细地显示对不同对象地不同调用,描述了对象之间的调用。
%E9%A1%BA%E5%BA%8F%E5%9B%BE.jpeg)
顺序图有两个纬度:垂直纬度和水平纬度。前者以时间发生的时间顺序显示调用的序列。后者显示消息被发送到的对象实例。如果有返回值还可以绘制一条带箭头的指向发起类实例的虚线。
阅读顺序图的时候通常从最左上面的消息开始,然后沿消息方向依次阅读。
活动图
活动图主要用于描述过程原理、业务逻辑以及工作流技术。活动图非常类似于传统的流程图,只不过它的区别是活动图支持并发。
可以看到下图,如果不是同时进行的话就是简单的流程图。
%E6%B4%BB%E5%8A%A8%E5%9B%BE.png)
绘制活动图时,整个活动只有一个开始活动,可以有多个结束活动。下面这个叫泳道,你可以理解为横坐标为角色,角色之间的调用。
%E6%B4%BB%E5%8A%A8%E5%9B%BE.png)
状态机图
与活动图很像,不过状态机图主要是描述某一对象生命周期中需要关注的不同状态,并会详细描述刺激对象状态改变的时间,以及对象状态改变时所采取的行动。实际上,通常只对感兴趣的对象描绘状态机图。
%E6%B4%BB%E5%8A%A8%E5%9B%BE.png)