UML,全称是Unified Modeling Language,中文是"统一建模语言"。通俗点说,UML是一种创建模型的语言。
UML是在开发阶段,说明,可视化,构建和书写一个面向对象软件密集系统的制品的开放方法。它使开发人员专注于建立产品的模型和结构,而不是选用什么程序语言和算法实现。当模型建立之后,模型可以被UML工具转化成指定的程序语言代码。
本章介绍通过UML绘图工具: visio。visio是Windows系统下创建图表的工具。
visio 的下载地址: http://pan.baidu.com/s/1i39N8fb
转载请注明出处: http://www.cnblogs.com/skywang12345/p/3523167.html
下面通过演示"visio中创建UML类图"的步骤,来说明visio的基本用法。
01. 新建UML图
打开"visio 2007"后,点击"文件" -> "新建" -> "软件和数据库" -> "UML模型图"。如下图所示。
新建UML模型图之后,看到如下图所示画面。图的左侧,是几种常用的UML图的图形元素。
02. 新建"类"
将"静态结构"中的"类",拖到绘图区域;然后,将字体大小设置为14。如下图所示。
03. 打开"UML类属性"对话框
双击绘图区域的"类1",弹出"UML类属性"对话框;并将类名修改为"int"。如下图所示。
04. 创建"int类"
点击"确定",创建"int类"。创建的"int类"在绘图区域的形状如下图所示。就这样,一个非常简单的类就创建成功了!
下面创建一个稍微基本的类Student,Student声明如下:
public class Student {
private int id;
public void setId(int id);
public int getId() ;
}
01. 打开"UML类属性"对话框。
第01~03步,新建一个类,打开一个"UML类属性"对话框,并设置类名为Student。如下图所示。
02. 创建"特性"。
点击对话框的"特性",并添加Student的属性"id",设置id的类型是int类型。如下图所示。
03. 创建"操作"。
(01) 点击对话框的"操作",并新建操作"setId"。如下图所示。
(02) 选中"setId",点击"属性",弹出"UML操作属性"对话框。如下图所示。
(03) 点击"UML操作属性"对话框,并新增参数"id",设置id的int类型,种类是in(输入参数)。如下图所示。
(04) 点击"确定"。返回"UML类属性"对话框。如下图所示。
(05) 点击"新建"按钮,新建操作"getId",并设置其返回类型是int。如下图所示。
04. 点击"确定",关闭"UML类属性"对话框。就这样,Student的类图就创建完成了。如下图所示。
05. 保存类图为jpg图片。
通过visio创建的文件,默认会被保存为.vsd格式。.vsd格式的文件包含了文件的完整信息,能方便下次修改!
但是,有时候我们需要将完成的visio图单独的抠出来。例如,将上面完成的Student单独的保存成一张图片。可以通过以下操作完成:
(01) 点击"文件" -> "另存为",弹出"另存为"对话框;然后将"保存类型"修改为"JPEG 文件交换格式"。如下图所示。
(02) 点击"确定",文件就被保存为一张JPEG图片。如下图所示。
本章介绍类图中类的UML表示方法。内容包括:
类图介绍
实体类的UML表示
抽象类和接口的UML表示
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3523185.html
类图,是UML(统一建模语言)中用于描述"类"以及"类与类"之间的示意图。它形象的描述出了系统的结构,帮助人们理解系统。
类图是在"所有的UML图"中,实用频率非常之高;掌握它对于我们软件设计,以及交流都很有帮助。
对于类图而言,它的基本单位是类。类主要由三部分组成:类名、属性、操作(函数)。UML类的表示大致如下:
下面,分别介绍"实体类", "抽象类", "接口"的UML表示方法。
注:本章的图形都是通过"UML系列01之 UML和绘图工具Visio介绍"中介绍的Visio工具进行绘制的!
实体类的UML示例
对应的java代码
public class Student { private int id; protected int age; public String name; private void setId(int id); private int getId() ; protected void setAge(int age); protected int getAge() ; private void setName(String name); private String getName() ; }
1. 类名
类名是类的名称。
2. 属性
UML类图中,属性的基本格式: 可见性 名称: 类型 [=缺省值]
(01) 可见性 -- 表示该属性对于类外的元素而言是否可见。 主要包括公有(public)、私有(private)和受保护(protected)三种,在类图中分别用符号+、-和#表示。 ┏━━━━━━┳━━━━━━━━━━━━━━━━━━┓ ┃ 标志 ┃ 可见性 ┃ ┣━━━━━━╇━━━━━━━━━━━━━━━━━━┫ ┃ + │ Public ┃ ┠──────┼──────────────────┨ ┃ # │ Protected ┃ ┠──────┼──────────────────┨ ┃ - │ Private ┃ ┗━━━━━━┷━━━━━━━━━━━━━━━━━━┛ (02) 名称 -- 表示属性名。 (03) 类型 -- 表示属性的数据类型。可以是基本数据类型,也可以是用户自定义类型。 (04) 缺省值 -- 属性的初始值。它是一个可选项。
3. 操作
UML类图中,属性的基本格式: 可见性 名称(参数类表) [:返回类型]
(01) 可见性 -- 表示该属性对于类外的元素而言是否可见。它的表示方法与"属性的可见性"相同。 ┏━━━━━━┳━━━━━━━━━━━━━━━━━━┓ ┃ 标志 ┃ 可见性 ┃ ┣━━━━━━╇━━━━━━━━━━━━━━━━━━┫ ┃ + │ Public ┃ ┠──────┼──────────────────┨ ┃ # │ Protected ┃ ┠──────┼──────────────────┨ ┃ - │ Private ┃ ┗━━━━━━┷━━━━━━━━━━━━━━━━━━┛ (02) 名称 -- 表示方法名。 (03) 参数列表 -- 表示方法的参数。参数个数是任意的,多个参数之间用逗号","隔开。 (04) 返回类型 -- 表示方法的返回值类型。它是一个可选项;可以是具体的返回类型,可以是void,也可以无返回类型(构造方法)。
1. 抽象类的UML表示
抽象类和实体类的UML表示法类似。区别是: "抽象类的类名是斜体",而"实体类的类名不是斜体"!
抽象类的UML示例
将上面"实体类示例"中的实体类Student改为抽象类AbstractStudent,对应的UML图如下:
2. 接口的UML表示
在UML中,通过在"类名"位置添加“interface”关键字来表示接口。示意图如下:
对应的代码:
public interface Runnable { public void run(); }
在"UML系列02之 UML类图(一) "中介绍了类图的基本构成--类的UML表示方法。本文是接着前文,继续对"UML的类图"中几种关系进行介绍。介绍的主要内容包括:
UML类图的几种关系
1. 泛化
2. 实现
3. 关联
3.1 自关联
3.2 单向关联
3.3 双向关联
3.4 多重性关联
3.5 聚合
3.6 组合
4. 依赖
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3523209.html
在UML类图中,关系可以分为4种: 泛化, 实现, 关联 和 依赖。
1. 泛化 -- 表示"类与类之间的继承关系"。
2. 实现 -- 表示"类与接口之间的实现"。
3. 关联 -- 表示"类与类之间的拥有关系"。即,一个类是另一个类的成员。关联又包括:自关联, 单向关联, 双向关联, 多重性关联, 组合, 聚合。
4. 依赖 -- 表示"类与类之间的使用关系"。即,一个类是另一类的局部变量, 形式参数, 或者调用了静态方法/成员等。
这几种关系表示的"类与类之间关系的强弱顺序"是:泛化 = 实现 > 关联 > 依赖
[关系说明]: 泛化是一种继承关系。它指定了子类如何特化父类的所有特征和行为。例如:老虎是动物的一种。
[代码说明]: 父类与子类。
[UML图形]: 带三角箭头的实线,箭头指向父类。
[示例]: Fruit是"水果";Apple是"苹果",它继承了Fruit,是水果中的一种。
UML示例图
对应的Java代码
public class Fruit { protected int price; public int getPrice() { return price; } public void setPrice() { return price; } } public class Apple extends Fruit { }
[关系说明]: 实现是一种类与接口的关系,表示类是接口所有特征和行为的实现。
[代码说明]: 实现类与接口。
[UML图形]: 带三角箭头的虚线,箭头指向接口。
[示例]: Runnable接口表示"一个任务",TimeTask是"计时任务",它实现了Runnable接口。
UML示例图
对应的Java代码
public interface Runnable { abstract public void run(); } public class TimeTask implements Runnable{ @Override public void run() { } }
关联表示"类与类之间的拥有关系"。即,一个类是另一个类的成员。关联包括:自关联, 单向关联, 双向关联, 多重性关联, 聚合, 组合。
3.1 自关联
[关系说明]: 一个类包含自己。例如,单向链表中的节点,包含下一个节点的信息。
[代码说明]: 成员变量
[UML图形]: 带普通箭头的实心线,指向被自己。
[示例]: Node是单向链表中的节点,它包含下一个节点的指针。
UML示例图
对应的Java代码
public class Node { private Node node; }
3.2 单向关联
[关系说明]: "类A"中有"类B"成员变量,"类B"中没有"类A"成员变量。
[代码说明]: 成员变量
[UML图形]: 带普通单向箭头的实心线,指向被拥有者。
[示例]: Person表示"人",IdCard表示"身份证信息",身份证包括id和"身份证编号snum"。一个人拥有唯一的身份证信息。
UML示例图
对应的Java代码
public class Person { private IdCard idcard; } public class IdCard { private int id; private String snum; }
3.3 双向关联
[关系说明]: "类A"中有"类B"成员变量,"类B"也有"类A"成员变量。
[代码说明]: 成员变量
[UML图形]: 带普通双向箭头的实心线 或者 不带箭头的实心线。
[示例]: Cusomer表示"客户",Product表示"产品"。客户可以购买产品,产品也属于客户。
UML示例图
对应的Java代码
public class Customer { private Address address; } public class Address { private Customer customer; }
3.4 多重性关联
[关系说明]: 多重性关联是两个类之间在关联对象上的数量关系。有如下几种:
┏━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 表示方法 ┃ 多重性关联说明 ┃
┣━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ 1..1 │ 表示另一个类的一个对象只与该类的一个对象有关系 ┃
┠────────┼──────────────────────────────────────────────────┨
┃ 0..* │ 表示另一个类的一个对象与该类的零个或多个对象有关系 ┃
┠────────┼──────────────────────────────────────────────────┨
┃ 1..* │ 表示另一个类的一个对象与该类的一个或多个对象有关系 ┃
┠────────┼──────────────────────────────────────────────────┨
┃ 0..1 │ 表示另一个类的一个对象没有或只与该类的一个对象有关系 ┃
┠────────┼──────────────────────────────────────────────────┨
┃ m..n │ 表示另一个类的一个对象与该类最少m,最多n个对象有关系(m≤n) ┃
┗━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
[代码说明]: 成员变量
[UML图形]: 实心线表示,单向关联则包括箭头,双向关联包括"两个箭头"或"不包含任何箭头"。
[示例]: Album是"相册",Picture是"图片",相册有N(N>=0)张图片。
UML示例图
对应的Java代码
public class Album { private Picture[] pics; } public class Picture { }
3.5 聚合
[关系说明]: 聚合是整体与部分的关系。聚合关系是类与类之间关系比较密切的关联关系;要区分聚合和其它的关联关系,必须考察具体的逻辑关系。在聚合关系中,成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在。如车和轮胎是整体和部分的关系。
[代码说明]: 成员变量
[UML图形]: 带空心菱形的实心线,菱形指向整体
[示例]: Car表示"汽车",Tire表示"轮胎"。"轮胎"本身是个独立个体。
UML示例图
对应的Java代码
public class Company { private Nose nose; private class Nose { } }
3.6 组合
[关系说明]: 组合是整体与部分的关系。组合关系是比聚合关系还要强的关联关系。但是在组合关系中整体对象可以控制成员对象的生命周期,一旦整体对象不存在,成员对象也将不存在,成员对象与整体对象之间具有同生共死的关系。例如,身体和鼻子,身体包括鼻子,鼻子不能脱离身体而独立存在。
[代码说明]: 成员变量
[UML图形]: 带实心菱形的实线,菱形指向整体
[示例]: Body表示"身体",Nose表示"鼻子"。身体包含鼻子,鼻子离不开身体。
UML示例图
对应的Java代码
public class Company { private Nose nose; private class Nose { } }
[关系说明]: 依赖是一种使用的关系。在需要表示一个事物使用另一个事物时使用依赖关系,尽量不使用双向的互相依赖。
[代码说明]: 局部变量、方法的参数或者对静态方法的调用
[UML图形]: 带箭头的虚线,指向被使用者
[示例]: 人过河。人是"Person"类,它包括过河函数acrossRiver(),acrossRiver()的参数是过河工具,返回值是过河时间。此处的过河工具是船,船对应的类是Boat。
UML示例图
对应的Java代码
public class Person { public int acrossRiver(Boat boat); } public class Boat { }
本章对UML的时序图进行介绍,主要内容包括:
时序图介绍
时序图组成
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3523355.html
时序图(Sequence Diagram),亦称为序列图或循序图,是一种UML行为图。
时序图是用来描述系统内部是如何交互运作的,它通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作。
时序图包含4类元素: 对象, 生命线, 消息, 激活。
在介绍这4类元素之前,先看一则简单的示例:系统(init.c)启动之后,会开启显示器(lcd.c)。这个流程的时序图如下:
1. 对象(Object)
对象实际上就是类或者类对象。例如,在上面的示例中,init.c和lcd.c都是对象。
2. 生命线(Lifeline)
生命线代表时序图中的对象在一段时期内的存在。它在时序图中用"一条垂直的虚线"表示。
3. 消息(Message)
消息是不同对象之间的交流机制。它位于两个对象之间,消息包括许多种,如下图:
4. 激活(Activation)
激活期代表时序图中的对象执行一项操作的时期。它在时序图中对应是"每条生命线上的窄的矩形"。
软件的基本流程图是我们在学习编程时的必修课,它很简单,却很实用。需要说明的是,UML并不包括软件的基本流程图,但是为了方便我自己查阅,所以将基本软件流程图归纳到UML系列当中。读者切不要认为基本流程图是属于UML的。本章对介绍的内容包括:
流程图介绍
流程图示例
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3520840.html
流程图(FlowChart)是描述我们进行某一项活动所遵循顺序的一种图示方法。它能通过图形符号形象的表示解决问题的步骤和程序。好的流程图,不仅能对我们的程序设计起到作用;在帮助理解时,往往能起到"一张图胜过千言万语"的效果。
下面是美国国家标准学会(American National Standards Institute,ANSI)制定的一些常用流程图符号的表格:
下面通过一个示例进行演示。
示例代码
1 import java.io.BufferedReader; 2 import java.io.InputStreamReader; 3 import java.io.IOException; 4 5 public class MathDemo { 6 7 public static void main(String[] args) { 8 9 System.out.print("please insert a number:"); 10 11 // 计算"0"到"iLen"的合 12 int sum = 0; 13 int iLen = getLen(); 14 for (int i=0; i) { 15 sum += i; 16 } 17 System.out.println("summary(0~"+iLen+")="+sum); 18 } 19 20 // 读取一个长度,默认返回100 21 private static int getLen() { 22 try { 23 BufferedReader in = 24 new BufferedReader(new InputStreamReader(System.in)); 25 26 // 读取一行,字符串 27 String str = in.readLine(); 28 // 将该字符串转换为int整型数 29 int len = Integer.parseInt(str); 30 31 in.close(); 32 return len; 33 } catch(IOException e) { 34 e.printStackTrace(); 35 return 100; 36 } 37 } 38 }
运行结果:
please insert a number:10 summary(0~10)=45
结果说明:
MathDemo的作用是,让用户输入一个整数。然后计算0到"这个整数"之间的和。
在例子中,输入的值是10;运行结果是0+1+2+3+4+5+6+7+8+9=45。
示例对应的流程图