UML类图--基于大话设计模式
类
一般矩形框代表类,类图分为三层,第一层显示类的名称,如果是抽象类,则就用斜体显示,如果是接口,则使用<<interface>>
;第二层是类的特性,通常就是字段和属性;第三层是类的操作,通常是方法或行为 。
注 意 前 面 的 符 号 , ‘+’ 表 示 public , ‘-’ 表 示 private , ‘#’ 表 示
protected。
有时候,如果是接口,uml类图中的矩形框在名字前面有I
标识或者<<interface>>
标识,
而普通的class一般是C
标识,抽象类是A
标识。这些属于看到明白什么意思就行。
具体来说:
<<interface>>
是UML中表示接口的标准图形符号。
名称使用斜体是UML中表示抽象类的标准图形符号。
I、A、C作为前缀是编程实践中的命名约定,而不是UML本身的图形符号规范。
普通类
抽象类
接口
关系
继承关系
继承关系用空心三角形+实线表示
实现接口
实现接口用空心三角形+虚线来表示
关联关系
用实线箭头来表示
聚合关系
聚合关系用空心的菱形+实线箭头来表示
聚合表示一种弱的’拥有’关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分。具体来说,就是A 类拥有 B 类对象,但 B 类对象可以脱离 A 类独立存在;同时他们的生命周期是分离的。注意:这个生命周期分离区别组合。
例如:大雁与雁群这两个类,大雁是群居动物,每只大雁都属于一个雁群,一个雁群可以有多只大雁。所以它们之间就满足聚合(Aggregation)关系
// 大雁类
public class Goose {private String name;public Goose(String name) {this.name = name;}public void fly() {System.out.println(name + " 正在飞行...");}public String getName() {return name;}
}
import java.util.List;public class GooseGroup {private List<Goose> geese;public GooseGroup(List<Goose> geese) {this.geese = geese;}public void groupFly() {System.out.println("雁群开始集体飞行:");for (Goose goose : geese) {goose.fly();}}
}
import java.util.Arrays;public class Main {public static void main(String[] args) {Goose g1 = new Goose("大雁A");Goose g2 = new Goose("大雁B");// Goose 对象可以独立创建GooseGroup group = new GooseGroup(Arrays.asList(g1, g2));// 雁群中可以调用大雁的方法group.groupFly();// 即使雁群销毁,大雁也可以继续存在g1.fly(); // 单独飞行}
}
这里的特征是:
Goose 可独立创建/存在
GooseGroup 包含 Goose 列表
Goose 生命周期不依赖 GooseGroup
组合/合成 Composition
合成(Composition,也有翻译成’组合’的)是一种强的’拥有’关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样。他们的生命周期是相同的。通常在构造器中创建子对象,并负责其生命周期。这个区别于聚合的一般是引用对象,不负责销毁和创建。
合成关系用实心的菱形+实线箭头来表示。另外,合成关系的连线两端还有一个数字’1’和数字’2’,这被称为基数。表明这一端的类可以有几个实例
以鸟类来举例,就是一个鸟有两个翅膀。当然如果一个类有n个实例,可以用n表示。
依赖关系
注意UML图中的依赖关系区别于面向对象中的依赖。UML中的依赖关系是一种建模层面的、宽泛的“使用”关系,而OOP中的依赖更关注在实现代码中的耦合方式。