统一建模语言UML简介
UML 语言有以下重要功能:可视化的功能、说明功能、建造功能、和建文档功能。
UML 包括以下的图:
使用案例图(Use case diagrams)
类图(class diagrams)
对象图(object diagrams)
序列图(Sequence diagrams)
合作图(Collaboration diagrams)
状态图(Statechart diagrams)
活动图(Activity diagrams)
构建图(Component diagrams)
部署图(Deployment diagrams)
在所有的图里面,案例图、类图和序列图是最有用的。
根据这些图的用意,可以大体上划分为结构型图和行为型图。
结构型图:
图的名字 | 介绍 |
类图(class diagrams) | 类图描述一些类、包的静态结构和他们之间的静态关系 |
对象图(object diagrams) | 对象图给出一个系统中的对象的快照 |
构建图(Component diagrams) |
描述可以部署的软件构件(比如jar文件、EJB)之间的静态关系 |
部署图(Deployment diagrams) |
描述一个系统之间的拓扑结构 |
行为型图:
图的名字 |
介绍 |
使用案例题(Use case diagrams) | 使用案例图描述一系列的角色和使用案例及它们之间的关系,可以用来对一 个系统的最基本的行为进行建模。 |
活动图(Activity diagrams) |
描述不同过程之间的动态接触,活动图是使用案例题所描述的行为的具体化 |
状态图(Statechart diagrams) |
描述一系列对象的内部状态及状态的变化和转移,注意一个类不能有两个不同 的状态图 |
序列图(Sequence diagrams) |
序列图是一种相互作用图,描述不同对象之间信息传递的顺序。 |
合作图(Collaboration diagrams) |
合作图是一种相互作用图,描述发出信息、接收信息的一系列对象的组织结构 |
类图:
在上面的类图中,可以看出,表示类的框分成以下几层:
1.类名
2.属性清单
3.方法清单
4.性质清单
一个类如果有内部类,它的类图就有5层,在类的类图中,除了类名层是不能省略、必须显示以外,其他都是可以再UML图中省略的。
第一层是类名。类名如果是正体字,说明类是可以实例化的,类名如果是斜体字,则表示类是抽象类。
第二层是属性层。属性可以是public、private或protected,属性左边是“+”,表示它是public;属性左边是“-”,表示它是private;属性左边是“#”,表示它是protected。
第三层是方法层。方法左边是“+”,表示它是public;方法左边是“-”,表示它是private;方法左边是“#”,表示它是protected。方法的下面如果有一道下划线,则表示这个方法是静态方法。
第四层是性质层。性质由一个属性即由一个内部变量,一个赋值函数和一个取值函数组成的结构。
描述接口的类图:
接口的类图和类的类图几乎一样,唯一的区别是接口的名字有“interface”的字样。
类图中的关系:
类与类之间,会有连线指明它们之间的关系。类和类、类和接口、接口和接口之间可以建立以下几种关系:一般化关系、关联关系、聚合关系、合成关系和依赖关系,这几种关系是静态的。
一般化关系:
一般化关系表示类与类之间的继承关系,接口与接口之间的继承关系,或类对接口的实现关系。一般化关系是从子类指向父类的,或者从实现接口的类指向被实现的接口,与继承或实现的方向相反。
一般化关系在java语言中可以直接翻译为关键字extends 和implements。
关联关系:
关联关系是类与类之间的联接,它使一个类知道另一个类的属性和方法,关联可以是双向的,也可以是单向的,双向关联有两个箭头或者没有箭头,单向关联有一个箭头,表示关联的方向,单向关联更为普通,一般不推荐使用双向关联。
在java语言里,关联关系是使用实例变量实现的。例如上面的Dirver类中,就出现了一个类型为car的实例变量,这个变量实现了这两个类之间的关联关系。每个关联都有一个名字,上面的例子中关联的名字就是Drivers。
聚合关系:
聚合关系是关联关系的7一种,是强的关联关系,聚合是整体和个体之间的关系。例如汽车类与引擎类、轮胎类,以及其他的零件类之间的关系便是整个和个体的关系。
与关联关系一样,聚合关系也是通过实例变量来实现的,以上面的例子为例,car类中应该有个类型为Engine的属性和类型为Tire的数组属性。但是关联关系所涉及的两个类是处在同一个层次上的,而聚合关系中,两个类是在不平等的层次上的,一个代表整体,一个代表部分。
关联与聚合仅仅从java语法上是分辨不出来的,需要考察所涉及的类之间的逻辑关系,如果不是很确定一个关系是不是聚合关系,可以将之设置成关联关系。
合成关系:
合成关系是关联关系的一种,是比聚合关系强的关系。它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期,合成关系是不能共享的。
代表整体的对象需要负责保持部分对象的存活,在一些情况下负责将代表部分的对象湮灭掉,代表整体的对象可以将代表部分的对象传递给另一个对象。由后者负责此对象的生命周期。换而言之,代表部分的对象在每个时刻只能与一个对象发生合成关系,由后者负责其生命周期。
在上面的类图中,显示了美猴王(MonkeyKing)以及他的四肢(limb)和他的金箍棒(GoldRingedStaff)之间的关系,可以看出MonkeyKing 与GoldRingedStaff之间是聚合的关系,而MonkeyKing与Limb 的之间的关系要比GoldRingedStaff的关系强,是合成关系。
如果不能确定一个关系是不是合成关系,可以将之看出聚合关系,甚至关联关系。
依赖关系:
依赖也是类与类之间的连接,依赖总是单向的。依赖关系表示一个类依赖于另一个类的定义。一个人(Penson)可以买房(House)和车(Car),Penson 类依赖于House 和Car类。如图所示:
在上面的例子中,Penson 类依赖于Car 类和 House 类的定义,因为Penson类 引用了Car 和House。与关联关系不同的是,Penson类中没有Car 和House的属性,Car和House的实例是以参数的形式传入到Penson中的buy方法中的。
一般而言,依赖关系在java语言中体现为局部变量、方法的参量,以及对静态方法的调用。换而言之,一个类A的某一个局部变量的类型是另一个类B,那么类A就依赖于类B。如果一个方法的参量是另一个类B的实例,那么这个方法所在的类A依赖于类B。如果一个个类A调用另一个类B 的静态方法,那么类A 就依赖于类B。
如果类B 出现在类A 的实例变量中,那么类A 与类B 的关系就超过了依赖关系,而变成了某一种关联关系。
一般而言,每个类图都应该有类、关联关系、基数。而关联关系的方向和关系中的角色是可选的。
转载于:https://my.oschina.net/gao0516/blog/109655