UML类图、多重性及Java代码实现实战

这边文章主要是对UML类图的几个常用的线条做一个大致的总结,看完这篇文章你应该也能基本看懂现在大部分的类图了,这不是一篇纯理论的文章,而是一篇实战又夹杂着一点实战的文章,读这篇文章前,希望读者已经对UML有了一点的了解。关于下面例子的解释是我个人的理解,如若有误,还请谅解及指出。

首先以一个例子开端,如UML图所示。

动物:

我们从动物开始,我可以看到有两条虚线箭头指向氧气和水。虚线箭头表示的是依赖关系。依赖关系指的是一种短期的利用关系,就像上边的动物,会利用氧气和水对象,用完就舍弃掉,对象(注意是对象,不是真正的动物)之间会建立短期的利用关系就是依赖关系

在代码实现上就类似将氧气和水作为参数传给动物对象的方法,动物方法用完就舍弃掉不会建立长久联系(像this.water=water这样,将依赖对象保存了起来就是建立了长期联系,就不是依赖,这是关联),对应Java代码如下: 

public class Animal {
    void live(Oxygen ox,Water w){
        System.out.println("using oxygen");
        System.out.println("using water");
        System.out.println("discard oxygen and water");
    }
}

然后就是继续往下。

鸟:

我们可以看到鸟和动物之间有一条空三角形直线连接,这样的符号是继承,就是我们Java代码里面的继承关系啦,然后我们看到鸟的右边还有一条实心菱形直线,这个符号的意思是组合关系,他是单向关联关系的一种,对于关联关系可以先看下面的大雁与气候那块,这里先说组合。组合的关系的一个起点就是需要对象之间需要有一种整体的关系。像鸟和翅膀就是整体关系,鸟就是整体,翅膀就是鸟的部分。但是像鸟和气候,他们不是整体关系(总不能说鸟是气候的一部分把🙂)。但是他们之间也有点关系,就是有些鸟会因气候发生迁徙,我们一般对那些不属于整体的,又有些关系的对象称为关联关系。回到组合关系,有组合关系的对象是相关性非常强的,强到他们的生命周期都必须一致,整体没了,部分也一定没有了,像鸟没有他的翅膀也就不存在了(别和我说鸟没有他的翅膀还可以用来做烤鸡翅😶。。。)。细心的同学应该注意到组合关系线上有两个数字,左边是*,右边是2。这就涉及到了UML的多重性问题了,多重性问题等会儿谈。右边的2相对于鸟来说的。指的是鸟有两个翅膀对象也就是说鸟的对象有两个翅膀的实例。左边的*是相对于翅膀的,*符号本身是指零个或者多个,刚才我们说过,组合是单向关联的,只有一个方向(从菱形方向到另一头),所以我们肯定不能像刚才鸟那样理解直接说翅膀有零个或多个鸟的实例。由于单向的原因,我们应该理解成,翅膀可以被零只或多只鸟拥有,大家可以仔细对比一下区别。下面是鸟的Java代码:

public class Bird extends Animal {
    private Wing leftWing;
    private Wing rightWing;
}

我们可以看到鸟继承了动物,并且拥有两只翅膀。

UML多重性:

我们有时候会碰到一个对象会和另外一个对象的多个实例产生关系,这个时候就需要用到我们的多重性了。表示的方法很简单,直接在关系线上添加一些数字,注意只有关联关系才用得上多重性,这些数字的规则如下:

1:一个
1…1:一个
0..*:零个或多个
*:零个或多个
1..*:一个或多个
0..1:零个或一个    m..n: m个到n个

大雁:

老规矩,首先继承下来。然后我们看右边,发现有一个单向实线箭头,它指的就是关联关系,而且还是单向关联的。单向关联就是对象间只有一个对另外一个产生关联,另外一个不产生关联的是对另一个产生关联的是不知情的,对上我们上面就是。大雁由于会因为气候改变而发生迁徙,所以对气候产生了关联,而气候它本身根本不知道大雁到底是什么鬼东西所以不会对大雁感冒。我们在大雁和气候上也看到了多重性。大雁只会关联一个气候(因为气候他就只有一个),而另外一边是*号,因为是单向的,所以表示为气候可以被多只大雁关联起来。在代码上就表示成大雁对象有一个对气候的引用,多只大雁对气候产生关联(多个大雁对象引用气候),但是气候对象没有对大雁的引用(气候根本不知道大雁)。

我们接着看大雁与雏鸟,他是一条直线,有时也表示成一直两端在加个箭头,他也表示关联,而且是双向关联。双向关联就是对象双方都和对方产生接触(单向只有一方对另一方产生接触),像大雁要照顾雏雁,雏雁反过来也需要大雁的照顾,所以他们为相互关联的关系,再看看他们的多重性,可以很容易理解,大雁可以有零或很多雏雁,所以是0..*,而雏雁只有一个父母所以是1(但这里其实有个疑问我现在也没弄清楚,先放在这里以后补上,或者有大佬知道这个问题的答案还请赐教。问题就是如果两个对象是双向关联的,怎么表示一个对象可以被另一个对象的多个实例引用)。

好了,关联的问题我们就讲完了,现在回头对比一下关联和依赖和组合的关系。先说关联和依赖,他们的关系重点就是有没有产生长期接触。像关联关系,他们之间产生了一个保存引用的操作,一个对象的引用会被另一个保存到字段上,所以产生了长期的接触,所以是关联。而依赖则在于一个对象的运行需要依赖另一个对象的帮助,像上边的动物对像的live()方法,需要有氧气和水对象来作为入参来使用,如果不给这两个入参,动物就没法生存了,并且动物用完氧气和水就随后抛弃了,没有保存其引用,也就是建立了短期的接触,所以是依赖。.

然后是关联和组合的区别,组合是一个特殊的单向关联,他和关联的本质区别在于组合关系的对象必定是一个整体,而且还是一个同亡的整体。像鸟和翅膀就是一个整体,并且鸟这个主题消失,翅膀也就消失了。像大雁和气候,他们之间有联系,但是又不是整体和部分的关系。所以就是关联关系。

然后继续我们看到大雁和飞,他们之间用空心三角加虚线,这个就是接口实现啦,Java中就是实现。

然后看最后一个,大雁和雁群。他们之间用空心菱形和实线,指的是聚合,聚合也是一种特殊的单向关联。它和组合一样,强调整体。但是它没有组合要求那么严格,组合要求对象间同亡,聚合不要求,整个消失了,部分还是可以但存在。像大雁与雁群,雁群没了,单独的大雁忍让可以存在。至于他们的多重性,大家就自己分析啦,这里就不再重复了。然后我们就看一下大雁的代码吧:

public class WildGoose extends Bird implements Fly{
    private Climate climate;
    private ChildWildGoose[] childs;
}

然后是雏雁的代码,雏雁和大雁是双向关联,所以雏雁也会有大雁的引用:

public class ChildWildGoose {
    private WildGoose parent;
}

好了,这篇文章就到这里,如果哪里有错还请指出,最后就是如果有人知道我刚才那个疑问的答案的话还请留言为我解答。🙂

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值