UML(Unified Modeling Language)即统一建模语言,是OMG(Object Management Group)发表的图标式软件设计语言。
UML的功能:
可视化:使用图表的形式来表现业务关系或者物理关系,可以促进对问题的理解和解决。
说明:UML提供了一种通用的、精通的、没有歧义的通信机制进行。
建造:UML通过自己的语法规则使得可以通过使用建模工具软件将设计模式映射到一种语言上。
建文档:使用UML进行设计可以同时产生系统设计文档。
UML包括:
用例图(Use case diagrams) 类图(Class diagrams) 序列图(Sequence diagrams)
合作图(Collaboration diagrams) 状态图(Statechart diagrams) 活动图(Activity diagrams)
构件图(Component diagrams) 部署图(Deployment diagrams)
类(Class). 包(Package). 接口(Interface)
常见的关系有:一般化关系、实现关系、聚合关系、合成关系和依赖关系。不同关系在图中连线表示的不同。
1一般化关系(Generalization)
在有的书籍和资料中也叫做“泛化关系”。 一般化关系表示类与类、接口与接口之间的继承关系。关系中的箭头由子类指向父类。在Java中,用extends关键字来直接表示这种关系。
public abstract class Employee{ } public class Programmer extends Employee{ }
2实现(Realization)
实例关系指定两个实体之间的一个合同。换言之,一个实体定义一个合同,而另一个实体保证履行该合同。关系中的箭头由实现接口的类指向被实现的接口。在Java中,实现关系可直接用implements关键字来表示。
或
public interface CollegePerson{ } public class Professor implements CollegePerson{ }
3关联(Association)
表示类与类之间的连接。它使一个类的可见属性和方法被另一个类使用。关联可以是双向或者单向的。双向的关联箭头是可选的,单向的箭头指向遍历或者查询的方向。在Java中,关联使用实例变量来实现。在关联关系中可以使用附加的基数来说明类之间对应的个数。
基数 |
含义 |
0..1 |
零个或者一个实例 |
0..*或者* |
没有限制,任意 |
1 |
有且只能一个实例 |
1..* |
至少有一个实例 |
常见的基数
public class UserGroup{ private UserRole uRole ; ...... } public class UserRole{ }
例:以权限中的用户组、用户角色为例,一个用户角色可以属于一个或者多个用户组,一个用户组则可以包含多个用户角色。如果用户组采用下面的方法来获得用户角色的权限…
注意:一个关联关系往往是聚合关系或者是合成关系。
注意:一个关联关系往往是聚合关系或者是合成关系。
4聚合(Aggregation)
聚合是关联的一种形式,代表两个类之间的整体/局部关系。聚合暗示着整体在概念上处于比局部更高的一个级别,而关联暗示两个类在概念上位于相同的级别。在Java中,聚合也是使用实例变量来实现的。
关联和聚合的区别纯粹是概念上的,在Java语法上分辨不出来的。聚合还暗示着实例图中不存在回路。换言之,只能是一种单向关系。
public class Car{ private Tyres tyres; } public class Tyres{ }
5合成(Composition)
合成是聚合的一种特殊形式,暗示“局部”在“整体”内部的生存期职责。合成关系是不能共享的。所以,虽然局部不一定要随整体的销毁而被销毁,但整体要么负责保持局部的存活状态,要么负责将其销毁。局部不可与其他整体共享。但是,整体可将所有权转交给另一个对象,后者随即将承担生存期职责。
public class Man{ private Legs legs; } public class Legs{ }
6依赖(Dependency)
依赖也是类与类之间的连接,并且依赖总是单向的。实体之间一个“使用”关 系暗示一个实体的规范发生变化后,可能影响依赖于它的其他实例。更具体地说,它可转换为对不在实例作用域内的一个类或对象的任何类型的引用。其中包括一个 局部变量,对通过方法调用而获得的一个对象的引用(如下例所示),或者对一个类的静态方法的引用(同时不存在那个类的一个实例)。也可利用“依赖”来表示包和包之间的关系。由于包中含有类,所以你可根据那些包中的各个类之间的关系,表示出包和包的关系。
public class Employee{ public void calcSalary(Calculator cSalary) { } }