首页 > 代码库 > UML类图学习
UML类图学习
UML(Unified Modeling Language)统一建模语言。包括以下几个重要功能:
- 可视化功能(Visualizing)
- 说明功能(specifying)
- 建造功能(Construting)
- 建文档功能(Documenting)
UML包括:
- 使用案例图(User case diagrams)
- 类图(Class diagrams)
- 序列图(Sequence diagrams)
- 合作图(Collaboration diagrams)
- 活动图(Activitiy diagrams)
- 构件图(Component diagrams)
- 部署图(Deployment diagrams)
其中使用案例图,类图,序列图是最为重要的。
我对类图进行总结:
类图:是显示出类,接口以及它们之间的静态结构和关系的图。类图的最基本元素就是类和接口。
如下图所示:
第一层:类名,第二层是属性层,包括public(+),protected(#),private(-)。第三层是方法层也包括public(+)方法,protected(#)方法,private(-)方法。根据类图可以变成具体的java代码,这里就不写了。
描述接口的类图:
类图中的关系:在类与类之间会有连线指明他们之间的关系。类和类、类和接口、接口和接口之间可以建立以下几种关系:一般化关系,关联关系,聚合关系合成关系,依赖关系,这几种关系都是静态的。
- 一般化关系(Generalization):表示类与类的继承关系,接口与接口的继承关系或者类对接口的实现关系。
如下图所示:
图1-类与类的继承关系(用实线白三角表示) 图2:类对接口的实现(用虚线白三角表示)
- 关联关系(Association):类与类之间的连接,它使一个类知道另一个类的属性和方法。关联可以是双向的,也可以是单向的,单向的使用一个箭头表示关联方向,双向的关联可以有两个箭头或者没有箭头。如下图:
相当于下面的java代码:
class Driver{
priavte Car car;//在Driver类中出现了一个类型为Car的实例变量
}
class Car{
}
每一个关联都有一个名字,在上面的图中关联的名字为Drivers。
在每一个关联的端点还可以有一个基数,表明一端的类可以有几个实例。 比如唐僧和他的徒弟形成一个关联关系,在这个关系里面唐僧只有一个,而徒弟却有好几个。如下图:
一个关联关系可以进一步确定为聚合关系或者合成关系。比如唐僧和他的徒弟的关系可以进一步确定为聚合关系。
- 聚合关系(Aggregation):是关联关系的一种,是强的关联关系。聚合是整体和个体之间的关系。例如:汽车类和引擎类、轮胎类,以及其他零件类之间的关系便是整体和个体的关系
一个汽车对象由一个引擎对象和四个轮胎对象组成的,如下图:
与关联关系一样,聚合关系也是通过实例变量来实现的:
java代码:Car类中应该有一个类型为Engine的属性和一个类型为Tire的数组属性。
class Car{
private Engine engine;
private Tire[] tires;
}
关联关系所涉及的两个类是处于同一个层次上的,而在聚合类中两个类是处于不平等的层次上的,一个代表整体,一个代表部分。
- 合成关系(composition):是关联关系的一种,是比聚合关系强的关系。他要求普通的聚合关系中代表整体的对象负责代表部分对象的生命周期,合成关系是不能共享的。看下面的图:
显示了美猴王(MonkeyKing)和他的四肢(Limb)以及他使用的金箍棒(GoldRingedStaff)之间的关系。可以看出美猴王(MonkeyKing)和他的武器金箍棒(GoldRingedStaff)是聚合关系,美猴王和他的四条腿(Limb)是合成关系。因为美猴王的四肢完全由美猴王负责,并且不能共享,美猴王的生命周期关系到他的腿的生命周期,一旦美猴王挂了,他的腿也就活不成了。 但是金箍棒就比他的腿更不重要一些。
- 依赖关系(dependency):也是类与类之间的关系,依赖总是单向的。依赖关系表示一个类依赖于另一个类的定义。例如,一个人(Person)类可以买车(Car)买房(House)。Person类依赖于Car类和House类。如图:
与关联关系不一样,Person类中并没有Car和House类的属性。Car和House的实例以参数的方式存入buy()方法中去。
java代码:
class Person{
public void buy(Car car){
......
}
public void buy(House house){
......
}
}
一般而言,依赖关系体现在java语言中为局部变量、方法的参数,以及对静态方法的调用。换言之,一个类A的某一个局部变量类型是另一类B,那么类A就依赖于类B。如果一个方法的参量是另一类B,那么这个方法所在的类A依赖于类B。或者如果一个类A调用另一个类B的静态方法,那么类A依赖于类B.