UML:类图

类图用于展现系统中的类及其相互之间的关系。本质上说,类图是现实世界问题领域的抽象对象的结构化、概念化、逻辑化描述。对类的理解有三个层次的观点,分别是概念层、说明层和实现层。在UML中,从开始的需求到最终的设计类,类图也是围绕着这三个层次的观点进行建模的。类图建模是先概念层,再说明层,进而实现层这样一个随着抽象层次的逐步下降而逐步细化的过程。html

概念层类图web

概念层的观点认为,在这个层次的类图描述的是现实世界中问题领域的概念理解,类图中表达的类与现实世界的问题领域有着明显的对应关系,类之间的关系也与问题领域中实际事物的关系有着明显的对应关系。在概念层上,类图着重于对问题领域的概念化理解,而不是实现,所以类名称一般都是问题领域中实际事物的名称。概念层的类图是独立于实现语言和实现方式的。设计模式

概念层类图位于业务建模阶段。一般在这个阶段类图是以领域模型图,即业务实体图来表示的。markdown

说明层类图架构

说明层的观点认为,在这个层次的类图考察的是类的接口而不是实现,类图中表达的类关系应当是对问题领域在接口层次抽象的描述。也就是说,这时候没必要关心类最终是用什么语言编码的、是用什么设计模式设计的、是遵循什么标准的,所关心的只是这样一些类,它们经过接口进行交互,进而完成了问题领域中的业务目标app

说明层类图是搭建在现实世界和最终实现之间的一座桥梁。在这个阶段,类一般都很是粗略,虽然它表达了计算机的观点,可是在描述上却采用了近似现实世界的语言,以保证从现实世界代码实现的过渡。编辑器

说明层类图位于概念模型阶段。在这个阶段,类图是以分析类和分析模型图来表示的。svg

实现层类图函数

实现层观点认为,类是实现代码的描述,类图中的类直接映射到可执行代码。在这个层次上,类必须明确采用哪一种实现语言、什么设计模式、什么通讯标准、遵循什么规范等。工具

实现层的类图大概是用得最广泛的,许多人在建模的时候根本没有概念层和说明层的类图而直接跳到实现层类图。缘由不是他们确认对问题领域已经足够了解,而且设计经验十分丰富,而一般是由于他们不知道类图还有三个层次的观点。

实现层类图位于设计阶段。在这个阶段,类图可视为伪代码。甚至能够用工具直接将实现层类图生成可执行代码。实际上许多MDA( Model Driven Architecture,模型驱动架构)建模工具就是经过模型来生成代码的,虽然Rose并不是纯粹的MDA工具,不过Rose也能够从类图生成可执行代码。

类之间的关系

表达类之间的关系时,类只须要画出名字就能够了,属性和方法能够省略显示。类之间的关系有:直线关系、包含关系、继承关系、依赖关系。

(1)“直线”关系

A、B两个类,它们之间有关系,但又不肯定是怎样的关系时,能够将此关系设定为“直线”“直线”关系其实就是关联(Association)“关联”是UML中文术语的标准说法。

“直线”关系是最多见的关系,最简单的“直线”关系就是两个类之间画条线就能够了。也能够进一步细化这条“直线”关系:在这条直线的两端,能够标记上数字名称数字表示是几对几的关系,名称则表示在这个关系中,直线两端的两个类分别是怎样的一个角色,而这条直线也能够变成带箭头的直线

写代码时,若是A类有一个成员变量保存的是类B的引用,也就是说由类A能够找到类B,那么,A类与B类之间的关系为“导航”关系。“导航”关系由“箭头”直线表示,箭头表示方向,由A可“导航”到B。

作软件需求分析时,若是以为两个业务概念之间有联系,但暂时不能肯定具体是怎样的,那么就先画一条线将二者连起来再说。随着对业务的理解,可对这条线条作进一步的具体化,为这条线添加更多的元素。

直线、几对几的关系、角色、箭头,能够搭配使用,以能准确反映出业务关系为目的。

“直线”关系只是一种俗称,UML中文术语标准是关联(Association)关系。另外,须要说明的是:类图中类太多时,为了排版方便,能够将“直线”画成“折线”,这称为“折线”关系

(2)“包含”关系

“包含”关系有两种表示法,一种是空心菱形,一种是实心菱形。两种菱形表示包含的强烈程度不一样,空心菱形是“弱”包含,实心菱形则是“强”包含。“弱”包含与“强”包含只是一种俗称,空心菱形的UML中文术语标准说法是聚合(Aggregation),实心菱形是组合(Composition)

(3)“继承”关系

“继承”一样是一种俗称,UML中文术语标准是泛化(Generalization),此关系用空心三角形来表示。泛化这个词能够理解为抽象、提炼等。

(4)“依赖”关系

“依赖(Dependency)”关系虚线箭头表示,这里的虚线箭头与“导航”关系的实线箭头很类似。所谓的“依赖”关系,依赖程度是相对而言的,不必定是A没有B就不能“生存”了。在具体的业务逻辑中,对于某个事情,A须要B来协助才能完成,这样也是一种依赖。

以下为类图中类之间关系的图形表示
在这里插入图片描述

Markdown编辑器绘制类图

教程
https://www.appinn.com/markdown/
https://www.cnblogs.com/zuizui2015/articles/4975559.html

(1)关联(Association)

类名用中括号[]表示,->表示导航关系-表示直线关系

代码 <img src="http://yuml.me/diagram/nofunky/class/[Customer]->[Billing Address]" >
效果

(2)基数(Cardinality)

基数-基数表示“关联”关系两端的基数,其中,基数能够为0,1,0..*等任意定义的值。

代码 <img src="http://yuml.me/diagram/nofunky/class/[Customer]1-0..*[Address]" >
效果

(3)“导航”关系

->表示“导航”关系,能够如此定义名称:-名称>

代码 <img src="http://yuml.me/diagram/nofunky/class/[Order]-billing >[Address], [Order]-shipping >[Address]" >
效果

(4)聚合(Aggregation)

<>->+->表示聚合关系。

代码 <img src="http://yuml.me/diagram/nofunky/class/[Company]<>-1>[Location], [Location]+->[Point]" >
效果

(5)组合(Composition)

++->表示组合关系。

代码 <img src="http://yuml.me/diagram/nofunky/class/[Company]++-1>[Location]" >
效果

(6)备注(Notes)

使用[note:注解内容]表示备注,一样备注能够自定义颜色{bg:颜色名}

代码 <img src="http://yuml.me/diagram/nofunky/class/[Customer]<>1->*[Order], [Customer]-[note: Aggregate Root{bg:cornsilk}]" >
效果

(7)继承(Inheritance)

使用^-表示类的继承关系,右边的类是子类。

代码 <img src="http://yuml.me/diagram/nofunky/class/[Wages]^-[Salaried], [Wages]^-[Contractor]" >
效果

(8)接口继承(Interface Inheritance)

使用^-.-表示接口继承关系。

代码 <img src="http://yuml.me/diagram/nofunky/class/[<<ITask>>]^-.-[NightlyBillingTask]" >
效果

(9)依赖关系(Dependencies)

使用-.->表示类的依赖关系,依赖是最弱的关联关系,通常用来表示类方法的参数或者实现用到了依赖类。

代码 <img src="http://yuml.me/diagram/nofunky/class/[HttpContext]uses -.->[Response]" >
效果

(10)接口(Interface)

和类名相比,接口的名称通常包含在<<>>中。

代码 <img src="http://yuml.me/diagram/nofunky/class/[<<IDisposable>>;Session]" >
效果

(11)类定义(Class with Details)

能够在类符号[]中定义类的全部成员。使用|表示类名与类成员变量和成员函数的分割符,不一样的成员之间用冒号;隔开,使用+,-分别表示公开和私有成员。

代码 <img src="http://yuml.me/diagram/nofunky/class/[User|+Forename+;Surname;+HashedPassword;-Salt|+Login();+Logout()]" >

效果

完整的示例

代码:
<img src="http://yuml.me/diagram/nofunky/class/[note: You can stick notes on diagrams too!{bg:cornsilk}],[Customer]<>1-orders 0..*>[Order], [Order]++*-*>[LineItem], [Order]-1>[DeliveryMethod], [Order]*-*>[Product], [Category]<->[Product], [DeliveryMethod]^[National], [DeliveryMethod]^[International]" >

效果: