UML图简介:
UML图中五种关系的强弱关系:依赖<关联<聚合<组合<继承
一 依赖关系
(一)·类图:(这些图都是EA画的,方便类图源码的生成)
(PS:fish类依赖于water类)(鱼依赖于水)
(二)生成源代码
通过代码,我们可以看到:两个类之间并没有任何的引用关系,这也就解释了为什么依赖是UML关系中最弱的一种。
(三)思考:
虽然依赖关系很弱,可是毕竟是一种关系,那在代码中是如何体现的?
1. Water 类是全局的,则fish类可以调用它。
2. water类是fish类的某个方法中的变量,则fish类中该方法可以调用它。
public class fish { public fish() { } public void Drink() { water a = new water(); Console.WriteLine("我要喝实例水" ); Console.Read(); } }
3. water类做为fish类中的方法的参数或返回值。
public class fish { public void Eat( water b) { Console.WriteLine("我要吃参数水"); Console.Read(); } public water Play() { water a = new water(); return a; } }
注意:在表现形式b和表现形式c的情况下,做为方法的变量,参数,或返回值时,其water类的生命周期随着方法的执行结束而结束。
二 关联关系:
关联关系表示类之间的耦合度比依赖强。具体体现在类图生成源码中,关联关系的源类会增加目标类的属性。其包括四种:单向关联,双向关联,聚合,组合。下面分别说一下这四种关联形式在代码中的具体体现。
(一)单向关联:
1 ·类图:
(PS:English类单项关联与Reading类)(英语和阅读能力关联)
2 ·源代码:
注意:从生成的源代码中我们可以看到:在源类(English类),存在着目标类Reading类的属性。
以上关系只是关联关系的一种,叫做——单向关联,特点是:源类知道目标类的属性和方法。但目标类并不知道源类的属性和方法。上边这个例子说道:想要知道英语的水平,它必须知道阅读能力的数据。
(二)双向关联:
区别于单项关联,一目了然,双向关联就是彼此知道彼此的属性和方法,在自己的类中都会有对方类的属性声明。
思考:依赖关系和关联关系的区别?
1·从是否生成类的属性来看:
依赖关系中,源类中并没有生成目标类的属性,而在关联关系中,源类中自动生成目标类的属性,而属性又是一种更为紧密的耦合,更为长久的持有关系。所以关联关系>依赖关系。
2 从生命周期的角度来看:
依赖关系中,是仅当类的方法被调用时产生 ,伴随着方法的结束而结束。
关联关系中,是当类被实例化时产生,当类销毁时关联关系随之结束,相比于依赖关系,关联关系生命周期更长。
(三)聚合:
类图:
(ps:woods类和tree类聚合关系)(森林和树是聚合关系)
源代码:
注意:空心菱形表示tree对象并不随着woods对象的创建而创建,销毁而销毁。
(四)组合:
类图:
(ps:bird类和wing类强烈的聚合关系)(鸟与翅膀)
源代码:
注意:wing类是bird类的组成部分。实心菱形表示wing对象随着bird对象的创建而创建,销毁而销毁。
思考:聚合和组合之间的关系:
(1)生命周期不一样:聚合关系中,tree类的生命周期并不随着woods类的变化,相对于组合较弱。组合关系中,wing类的生命周期随着bird类的销毁而销毁。
(2)构造函数不一样:聚合类的构造函数中包含另一个类做为参数。即森林类(woods)的构造函数要用到树类(tree)做为参数,但tree类可以脱离森林类独立存在。组合类的构造函数中包含了另一个类的实例化,即鸟类(bird)的构造函数初始化时,先实例化翅膀类(wing),即共生存,同灭亡。
三 泛化关系:
(一)类图:
(ps:pig类继承Animal类)(猪继承动物)
(二)源代码:
(三)思考:泛化和继承什么关系?
泛化和继承是从不同角度来说的。子类继承父类,父类泛化子类。
四 实现关系:
(一)类图:
(ps:person类实现Eat接口)(人实现吃接口)
(二)源代码:
(三)思考:
可以看到子类实现父类,和类实现接口在代码中表现形式一样,那接口 和父类什么关系?接口和抽象类是什么关系?参考博客《抽象类和接口的区别》