1.11 UML 类图
小菜: “对了, 我时常在一些技术书中看到这些类图表示, 简单的还看得懂, 有些标记我很容易混淆. 要不你给我讲讲吧.”
大鸟: “这个其实用的多看得多就熟悉了. 我给你举一个例子, 来看这样一张图, 其中就包括了 UML 类图中的基本图示法.”
- UML 类图图示样例
大鸟: “首先你看那个 ‘动物’ 隽星框, 它就代表一个类(Class). 类图分三层, 第一层显示累的名称, 如果是抽象类, 就用斜体显示. 第二层是累的特性, 同城就是自端和属性第三层是类的操作, 通常是方法或行为. 注意前面的符号, “+” 表示 public, “-” 表示 private, “#” 表示 protected. “
大鸟: “然后注意左下方的 ‘飞翔’, 他表示一个借口图, 与类图的却别主要是顶端有<< inteface >> 显示. 第一行是借口名称, 第二行是借口方法. 借口还有另一种表示方法, 俗称棒棒糖表示法, 比如图中的唐老鸭类就是实现了 ‘讲人话’ 的接口.”
小菜: “为什么要是 ‘讲人话’ ?”
大鸟: “鸭子本来也有语言, 只不过只有唐老鸭是能讲人话的鸭子.”
小菜: “有道理.”
public interface IFly{
void Fly();
}
public interface ILanguage{
void speak();
}
大鸟: “接下来就可以讲类与类, 类与接口之间的关系了. 你可首先注意动物, 鸟, 鸭, 唐老鸭之间关系符号.”
小菜: “明白了, 他们都是继承的关系, 继承关系用空心三角形 + 实线来表示.”
大鸟: “我举得几种鸟中, 大雁是最能飞的, 我让他实现了飞翔接口. 是想接口用空心三角形 + 加虚线来表示.”
public class Bird extends Animal{
}
public class WideGoose implements IFly{
}
大鸟: “你看企鹅和七楼两个类, 企鹅是很特表的鸟, 会游不会飞. 更重要的是, 他与气候有很大的关联. 我们不去谈论为什么北极没有企鹅, 为什么他们每年要长途跋涉. 总之, 切需要 ‘知道’ 气候的变化, 西药 ‘了解’ 气候规律. 当一个类 ‘知道’ 另一个类时, 可以用关联(association). 关联关系用实线箭头来表示.
public Class Penguin extends Bird{
// 在企鹅 Pengguin 中, 引用到气候 climate 对象
private Climate climate;
}
大鸟: “我们再来看大雁与雁群这两个类, 大雁是群居动物, 每只大雁都属于一个雁群, 一个雁群可以有多只大雁. 所以他们之间就满足集合(Aggregation) 关系. 聚合表示一种弱的 ‘拥有’ 关系, 体现的是 A 对象可以包含 B 对象, 但是B 对象不是A 对象的一部分[DPE] . 聚合关系用空心的菱形 + 实现箭头来表示. “
public Class WideGooseAggregate{
// 在雁群 WideGooseAggregate 类中, 有大雁数组对象 arrayWideGoose
private WideGoose[] arrayWideGoose;
}
大鸟: “合成(Composition, 也有翻译成 ‘组合’ 的) 是一种强的 ‘拥有’ 关系, 体现了严格的部分和整体的关系, 部分和整体的生命周期一样[DPE]. 在这里尼奥和其翅膀就是组合(合成) 关系, 因为他们是部分和整体的关系, 并且翅膀和鸟的生命周期是相同的. 合成关系用实心的菱形 + 实现箭头来表示. 另外, 你会注意到合成关系的连线两端还有一个数字 ‘1’ 和数字 ‘2’, 这被称为基数. 表明这一端的类可以有几个实例, 很显然, 一只鸟应该有两只翅膀. 如果一个类可能有无数个实例, 则就用 ‘n’ 来表示. 关联关系, 聚合关系也可以有基数的.”
public class Bird{
private Wing wing;
Bird() {
wing = new wing();
}
}
大鸟: “动物几大特征, 比如有新城代谢, 能繁殖 而动物要有生命力, 需要氧气, 水以及食物等. 也就是说, 动物以来与氧气和水. 他们之间是依赖关系(Dependency), 用虚线箭头来表示.”
public abstract class Animal{
public metabolism(Oxygen oxygen, Water water){
}
}
小菜: “看来UML 类图也不算难啊. 回想那天我面试题写的代码 我终于明白我为什么写的不成功了, 原来一个小小的计算器也可以写出这么精彩的代码, thank bird.
大鸟: “吼吼, 记住哦, 编程是一门技术, 更加是一门艺术. 不能只满足于写完代码运行结果正确就完事儿, 时常思考如何让代码更加简练, 更加容易维护, 容易扩展和复用, 只有这样才可以真正得到提升. 写出优雅的代码真的是一种很爽的事情. UML 图也不是医学就会的, 需要有一个慢慢熟练的过程. 所谓学无止境, 其实这才是理解面向对象的开始呢.