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