00.1 番外篇1 - UML 类图

1.11 UML 类图

    小菜: “对了, 我时常在一些技术书中看到这些类图表示, 简单的还看得懂, 有些标记我很容易混淆. 要不你给我讲讲吧.”

    大鸟: “这个其实用的多看的多就熟悉了. 我给你举一个例子, 来看这样一张图, 其中就包括了 UML 类图中的基本图示法.”



    大鸟: “首先你看那个 ‘动物’ 矩形框, 它就代表一个类(Class). 类图分三层, 第一层显示类的名称, 如果是抽象类, 就用斜体显示. 第二层是类的特性, 统称就是字段和属性. 第三层是类的操作, 通常是方法或行为. 注意前面的符号, “+” 表示 public, “-“ 表示 private, “#” 表示 protected. “



    大鸟: “然后注意左下方的 ‘飞翔’, 他表示一个接口图, 与类图的区别主要是顶端有<< inteface >> 显示. 第一行是接口名称, 第二行是接口方法. 接口还有另一种表示方法, 俗称棒棒糖表示法, 比如图中的唐老鸭类就是实现了 ‘讲人话’ 的接口.”
    小菜: “为什么要是 ‘讲人话’ ?”
    大鸟: “鸭子本来也有语言, 只不过只有唐老鸭是能讲人话的鸭子.”
    小菜: “有道理.”



1
2
3
4
5
6
7
public interface IFly{
void Fly();
}
public interface ILanguage{
void speak();
}

    大鸟: “接下来就可以讲类与类, 类与接口之间的关系了. 你可首先注意动物, 鸟, 鸭, 唐老鸭之间关系符号.”
    小菜: “明白了, 他们都是继承的关系, 继承关系用空心三角形 + 实线来表示.”



    大鸟: “我举得几种鸟中, 大雁是最能飞的, 我让他实现了飞翔接口. 实现接口用空心三角形 + 加虚线来表示.”



1
2
3
4
5
6
7
public class Bird extends Animal{
}
public class WideGoose implements IFly{
}

    大鸟: “你看企鹅和气候两个类, 企鹅是很特表的鸟, 会游不会飞. 更重要的是, 他与气候有很大的关联. 我们不去谈论为什么北极没有企鹅, 为什么他们每年要长途跋涉. 总之, 切需要 ‘知道’ 气候的变化, 需要 ‘了解’ 气候规律. 当一个类 ‘知道’ 另一个类时, 可以用关联(association). 关联关系用实线箭头来表示.



1
2
3
4
public Class Penguin extends Bird{
// 在企鹅 Pengguin 中, 引用到气候 climate 对象
private Climate climate;
}

    大鸟: “我们再来看大雁与雁群这两个类, 大雁是群居动物, 每只大雁都属于一个雁群, 一个雁群可以有多只大雁. 所以他们之间就满足集合(Aggregation) 关系. 聚合表示一种弱的 ‘拥有’ 关系, 体现的是 A 对象可以包含 B 对象, 但是B 对象不是A 对象的一部分[DPE] . 聚合关系用空心的菱形 + 实现箭头来表示. “



1
2
3
4
public Class WideGooseAggregate{
// 在雁群 WideGooseAggregate 类中, 有大雁数组对象 arrayWideGoose
private WideGoose[] arrayWideGoose;
}

    大鸟: “合成(Composition, 也有翻译成 ‘组合’ 的) 是一种强的 ‘拥有’ 关系, 体现了严格的部分和整体的关系, 部分和整体的生命周期一样[DPE]. 在这里鸟和其翅膀就是组合(合成) 关系, 因为他们是部分和整体的关系, 并且翅膀和鸟的生命周期是相同的. 合成关系用实心的菱形 + 实现箭头来表示. 另外, 你会注意到合成关系的连线两端还有一个数字 ‘1’ 和数字 ‘2’, 这被称为基数. 表明这一端的类可以有几个实例, 很显然, 一只鸟应该有两只翅膀. 如果一个类可能有无数个实例, 则就用 ‘n’ 来表示. 关联关系, 聚合关系也可以有基数的.”



1
2
3
4
5
6
public class Bird{
private Wing wing;
Bird() {
wing = new wing();
}
}

    大鸟: “动物几大特征, 比如有新陈代谢, 能繁殖. 而动物要有生命力, 需要氧气, 水以及食物等. 也就是说, 动物以来与氧气和水. 他们之间是依赖关系(Dependency), 用虚线箭头来表示.”



1
2
3
4
5
public abstract class Animal{
public metabolism(Oxygen oxygen, Water water){
}
}

    小菜: “看来UML 类图也不算难啊. 回想那天我面试题写的代码 我终于明白我为什么写的不成功了, 原来一个小小的计算器也可以写出这么精彩的代码.
    大鸟: “吼吼, 记住哦, 编程是一门技术, 更加是一门艺术. 不能只满足于写完代码运行结果正确就完事儿, 时常思考如何让代码更加简练, 更加容易维护, 容易扩展和复用, 只有这样才可以真正得到提升. 写出优雅的代码真的是一种很爽的事情. UML 图也不是一学就会的, 需要有一个慢慢熟练的过程. 所谓学无止境, 其实这才是理解面向对象的开始呢.

~感谢捧场,您的支持将鼓励我继续创作~