文章目录


本文为我设计模式相关博客的前置内容,所以只会整理学习设计模式中需要用到的知识。
学习统一建模语言需要有面向对象编程的知识和经验,务必在学习UML之前学习面向对象编程。


统一建模语言 Unified Modeling Language

  “统一建模语言(Unified Modeling Language)是描述、构造和文档化系统产品的可视化语言。”

  在上述中,UML的关键点在于可视化;UML是图形化表示法的事实标准,用来描绘和展示与软件相关的体系。

  这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关系; 能看懂类图中各个类之间的线条、箭头代表什么意思后,也就足够应对日常的工作和交流; 同时,我们应该能将类图所表达的含义和最终的代码对应起来; 有了这些知识,看后面章节的设计模式结构图就没有什么问题了;

UML建模工具

Rational Rose

  Rational Rose是Rational公司出品的一种面向对象的统一建模语言的可视化建模工具。用于可视化建模和公司级水平软件应用的组件构造。

PowerDesigner

  PowerDesigner最初由Xiao-Yun Wang(王晓昀)在SDP Technologies公司开发完成。PowerDesigner是Sybase的企业建模和设计解决方案,采用模型驱动方法,将业务与IT结合起来,可帮助部署有效的企业体系架构,并为研发生命周期管理提供强大的分析与设计技术。

StartUML

  StarUML是一种生成类图和其他类型的UML图表的工具。本文是一个使用StarUML创建类图(Java语言描述)的简明手册。StarUML,是一种创建UML类图,并能够自动生成Java的“stub code” 的工具。StarUML也可以做JAVA逆向工程,以产生相应的UML图表。

Office Visio

  Office Visio 是Office软件系列中的负责绘制流程图和示意图的软件,是一款便于IT和商务人员就复杂信息、系统和流程进行可视化处理、分析和交流的软件。使用 Office Visio 图表,可以促进对系统和流程的了解。

Drawio

  drawioDrawio是一款强大、免费的绘图工具(基本可以替代收费的Visio等),使用起来非常方便。支持网页版使用(网页版可以自己部署一套)以及客户端使用(支持windows,MacOS以及Linux)。

  该项目开源在github上的源码:https://github.com/jgraph/drawio-desktop

  官方的教程链接:https://www.diagrams.net/doc/

  哔哩哔哩:​​【流程绘制】开源免费!drawio 中文简易教程​

UML类图

  UML用类图(class diagram)表示类、接口的内部结构 (属性, 方法)和类之间的关系(泛化、实现、依赖、关联、聚合、组合)。类图用于静态对象建模

  你可以通过这个10分钟的视频(​​10 分钟学会 UML 类图(UML Class Diagram Tutorial)​

)更高效地了解UML类图的基础知识。如果已有UML类图的相关知识,可以跳过这部分。

类元

  UML类元(classifier)是“描述行为和结构特性的模型元素”。在类图中,最常用的两种类元是类和接口。

组成部分

  在UML类图中,类元一般由三部分组成:类名、类的属性和类的方法。如下图所示,这是一个表示Animal类的类元。

统一建模语言 Unified Modeling Language_类图

类元名

  类元中最上面的部分是类元名;每个类元都必须有一个名字,类元名是一个字符串。

关键字

  UML关键字是对模型元素分类的文本休息。例如,定义类元框图的类别为接口的关键字是《interface》。

统一建模语言 Unified Modeling Language_java_02

  大部分关键字使用“《》”符号表示,但是有些关键字用大括号表示,例如{abstract},这是包含了abstract关键字的约束

统一建模语言 Unified Modeling Language_可见性_03

属性

  类元中第二部分是类的属性(Attributes):属性是指类的性质,即类的成员变量。一个类可以有任意多个属性,也可以没有属性。

  属性语法 : [可见性]属性名[ :类型][ =初始值][{属性字符串}]

  属性字符串用来指定关于属性的其它信息 , 不一定是是属性值, 如果希望添加一个属性定义规则 , 但是没地方添加, 可以写在属性字符串中 ;

可见性

  属性的可见性只有公有(Public),私有(Private)和受保护(Protected);UML中不存在默认的可见性, 如果没有显示任何符号, 就表示没有定义该属性;

  公有(Public),用 “+” 表示,可以在此类的外部使用查看该属性;

  私有(Private),用 “-” 表示,不可以从外部类中访问该属性;

  受保护(Protected),用 “#” 表示,常与继承一起使用。

方法

  方法语法:[可见性]操作名[( 参数表 )][:返回类型][ { 属性字符串 } ]

可见性

  方法的可见性有公有(Public),私有(Private),受保护(Protected)和包内(Package)四种;

  公有(Public),用 “+” 表示,只要调用对象能访问操作所在的包, 就能访问公有操作;

  私有(Public),用 “-” 表示,同一个类的对象才能调用私有的操作;

  保护(Public),用 “#” 表示,子类对象才可以调用受保护操作;

  包内(Package),用 “~” 表示,同一个包内的对象才可以调用包内公有的操作。

关系

继承关系 Inheritance

  继承关系(Inheritance)又被成为泛化关系(Generalization);

  继承的含义是is-a,如果两个对象之间可以用is-a来表达,那就是继承关系。例如:狗是动物。

统一建模语言 Unified Modeling Language_可见性_04

实现关系 Realize

  实现关系(Realize)又被成为实现关系(Impalemention);

  实现关系用一条带空心箭头的虚线表示;:”车”为一个抽象概念,在现实中并无法直接用来定义对象;只有指明具体的子类(汽车还是自行车),才 可以用来定义对象(”车”这个类在C++中用抽象类表示,在JAVA中有接口这个概念,更容易理解)。

统一建模语言 Unified Modeling Language_java_05

聚合关系 Aggregation

  聚合关系用一条带空心菱形箭头的直线表示,如下图表示A聚合到B上,或者说B由A组成;

  聚合关系用于表示实体对象之间的关系,表示整体由部分构成的语义;例如一个部门由多个员工组成;

  与组合关系不同的是,整体和部分不是强依赖的,即使整体不存在了,部分仍然存在;例如, 部门不存在了,职员仍不会消失,他们依然存在;

统一建模语言 Unified Modeling Language_uml_06

组合关系 Composition

  ,如下图表示职员代表组成B,或者B由A组成;

  与聚合关系一样,组合关系同样表示整体由部分构成的语义;比如公司由多个部门组成;

  但组合关系是一种强依赖的特殊聚合关系,如果整体不存在了,则部分也不存在了;例如, 访客中心不存在了,访客大厅也就不存在了;

统一建模语言 Unified Modeling Language_类图_07

关联关系 Association

  它描述不同类的对象之间的结构关系;它是一种静态关系, 通常与运行状态无关,一般由常识等因素决定的;它一般用来定义对象之间静态的、天然的结构; 所以,关联关系是一种“强关联”的关系;

  比如,乘车人和车票之间就是一种关联关系;学生和学校就是一种关联关系;

  关联关系默认不强调方向,表示对象间相互知道;如果特别强调方向,如下图,表示A知道B,但 B不知道A;

  在最终代码中,关联对象通常是以成员变量的形式实现的;

统一建模语言 Unified Modeling Language_java_08

依赖关系 Dependency

  依赖关系是用一套带箭头的虚线表示的;如下图表示A依赖于B;他描述一个对象在运行期间会用到另一个对象的关系;

  与关联关系不同的是,它是一种临时性的关系,通常在运行期间产生,并且随着运行时的变化; 依赖关系也可能发生变化;

  显然,依赖也有方向,双向依赖是一种非常糟糕的结构,我们总是应该保持单向依赖,杜绝双向依赖的产生;

  注:在最终代码中,依赖关系体现为类构造方法及类方法的传入参数,箭头的指向为调用关系;依赖关系除了临时知道对方外,还是“使用”对方的方法和属性;

统一建模语言 Unified Modeling Language_关联关系_09