UML类图细节

类图表述的是类和类之间的关系,是前期用来推演代码设计,后期用来优化代码的结构,寻找设计不合理之处。网上解释类图和类图的画法,往往表述的十分晦涩,或者例子呆板,很难具体的操作。

       类图一般在详细设计过程中出现,主要用来描述系统中各个模块中类之间的关系。也就是说,看完类图之后,你要能想象出代码大体的实现。能做到这点,才能说会看类图。类的关系一般分为3种,分别是依赖、关联、继承。先上张各个关系的表示图:

 

       依赖,维基百科的解释是类和类之间弱连接,只在某一个时间点,有调用关系。从代码实现角度来看,一般分为三种:对象作为方法参数、对象作为局部变量、调用类的静态方法。即一个类function的括号内所调用的类,与它自己都是依赖关系。因为这种关系是弱连接的,从高内聚低耦合的角度来看,这样的代码组织最优,无论是面向对象还是面向过程。

      依赖中有一个特殊的现象,即相互依赖。推敲上面对依赖的解释,相互依赖可以理解为:A类的函数可以调用B类函数的局部变量,反之同样。更加普遍的学名应该是闭包。虽然和动态语言的支持力度不一样,但java的确是支持的,就是匿名内部类。这样的结构,处理回调十分有优势。换句话说:看到类图里有相互依赖的无箭头虚线,就能得出这里有回调关系。

       关联则是一种强连接关系,代码上表现为将一个类的对象作为另一个类的成员变量。关联又有两种常见的关联关系:组合和聚合。这两种区别十分的明显:在类A中有成员变量类B的实例b,如果b的生命周期一直在类A之内,则表明A关联B,且是组合关系。如果类A生成了b,而且将其传到类C,则类B与A,C都是关联,且是聚合关系,因为b的生命周期不再由A单独掌握。

找一个网上的图(图(2)),意会一下其中的区别。

 

     其实我觉得这两种情况在真正的编码的时候,是不容易混淆的,因为他们的作用完全不一样。组合的方式主要用于代码的复用,竞争对手是继承,用于类的构建。而聚合的方式主要用于类似工厂模式,生成一些符合规格的实例,填入属性,给其他的类使用,用于代码运行时。

      继承,不同于关联和依赖,它是按照现有类的类型创建新的类的方式。从线条上来说分为一般化和实现。常见的我们使用一般化,而使用实现通常在强调这是一个final类。在《Java编程思想》一书中,对应该使用继承还是组合复用代码有一个经典的判断:是否需要从新类向基类进行向上转型,如果必须,则用继承,否则应该用组合。

      总结下,为了使代码高内聚低耦合,这3方式,依赖优于关联优于继承。复用类方面,组合比继承更加灵活。

posted @ 2015-10-27 16:22  身带吴钩  阅读(785)  评论(0编辑  收藏  举报