类图(Class Diagram)是显示出类、接口以及他们之间的静态结构与关系的图。其中最基本的单元是类或接口。java
类图不但能够表示类(或者接口)之间的关系,也能够表示对象之间的关系。下面是一个典型的类图:
函数
类图通常分为几个部分:类名、属性、方法。下面分别讲解。this
(1) 类名3d
上面的TestClass就是类名,若是类名是正体字,则说明该类是一个具体的类,若是类名是斜体字,则说明类是一个抽象类abstract。code
(2)属性列表对象
属性能够是public、protected、private。public前面的图标是菱形,protected对应的是菱形加钥匙,private对应的是菱形加锁。固然,这只是一种表现方式。我是用的是Rational Rose,若是用的是别的软件,还可能使用+、-、#表示:+表明public、-表明private、#表明protected。blog
(3)方法列表继承
方法能够是public、protected、private。public前面的图标是菱形,protected对应的是菱形加钥匙,private对应的是菱形加锁。固然,这只是一种表现方式。我是用的是Rational Rose,若是用的是别的软件,还可能使用+、-、#表示:+表明public、-表明private、#表明protected。接口
对于静态属性,属性名会加上一条下划线。如上图所示。生命周期
此外,类图既能表示类之间的关系,还能表示对象之间的关系。两者的区别是:对象图中对象名下面会加上一条下划线。
Generalization表示的是类与类之间的继承关系、接口与接口之间的继承关系、类与接口之间的实现关系。即指继承与实现
能够简单的理解,就是一个类A使用到了另外一个类B,而这种使用关系是具备偶然性的、临时性的、很是弱的,可是B类的变化会影响到A;好比某人要过河,须要借用一条船,此时人与船之间的关系就是依赖;表如今代码层面,为类B做为参数被类A在某个method方法中使用,依赖是单向的,要避免双向依赖。通常来讲,不该该存在双向依赖。
他体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,好比我和个人朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,通常是长期性的,并且双方的关系通常是平等的、关联能够是单向、双向的,双向关联有两个箭头或者没有箭头,单向关联有一个箭头,表示关联的方向,关联关系以实例变量的形式存在,在每个关联的端点,还能够有一个基数(multiplicity),代表这一端点的类能够有几个实例;表如今代码层面,为被关联类B以类属性的形式出如今关联类A中,也多是关联类A引用了一个类型为被关联类B的全局变量;
聚合是关联关系的一种特例,他体现的是总体与部分、拥有的关系,即has-a的关系,此时总体与部分之间是可分离的,他们能够具备各自的生命周期,部分能够属于多个总体对象,也能够为多个总体对象共享;好比计算机与CPU、公司与员工的关系等;表如今代码层面,和关联关系是一致的,只能从语义级别来区分;
组合也是关联关系的一种特例,他体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合;他一样体现总体与部分间的关系,但此时总体与部分是不可分的,总体的生命周期结束也就意味着部分的生命周期结束;好比你和你的大脑;表如今代码层面,和关联关系是一致的,只能从语义级别来区分;
1.聚合与组合
(1)聚合与组合都是一种关联关系,只是额外具备总体-部分的意涵。
(2)部件的生命周期不一样
聚合关系中,整件不会拥有部件的生命周期,因此整件删除时,部件不会被删除。再者,多个整件能够共享同一个部件。
组合关系中,整件拥有部件的生命周期,因此整件删除时,部件必定会跟着删除。并且,多个整件不能够同时间共享同一个部件。
(3)聚合关系是“has-a”关系,组合关系是“contains-a”关系。
程老师的《大话》里举大那个大雁的例子很贴切 在此我就借用一下 大雁喜欢热闹惧怕孤独 因此它们一直过着群居的生活 这样就有了雁群 每一只大雁都有本身的雁群 每一个雁群都有好多大雁 大雁与雁群的这种关系就能够称之为聚合 另外每只大雁都有两只翅膀 大雁与雁翅的关系就叫作组合 有此可见 聚合的关系明显没有组合紧密 大雁不会由于它们的群主将雁群解散而没法生存 而雁翅就没法脱离大雁而单独生存——组合关系的类具备相同的生命周期
聚合关系图:
组合关系图:
从从代码上看这两种关系的区别在于:
构造函数不一样
雁群类:
public class GooseGroup { public Goose goose; public GooseGroup(Goose goose) { this.goose = goose; } }
大雁类:
public class Goose { public Wings wings; public Goose() { wings=new Wings(); } }
聚合关系的类里含有另外一个类做为参数
雁群类(GooseGroup)的构造函数中要用到大雁(Goose)做为参数把值传进来 大雁类(Goose)能够脱离雁群类而独立存在
组合关系的类里含有另外一个类的实例化
大雁类(Goose)在实例化以前 必定要先实例化翅膀类(Wings) 两个类紧密耦合在一块儿 它们有相同的生命周期 翅膀类(Wings)不能够脱离大雁类(Goose)而独立存在
信息的封装性不一样
在聚合关系中,客户端能够同时了解雁群类和大雁类,由于他们都是独立的
而在组合关系中,客户端只认识大雁类,根本就不知道翅膀类的存在,由于翅膀类被严密的封装在大雁类中。
2.关联和聚合
(1)表如今代码层面,和关联关系是一致的,只能从语义级别来区分。
(2)关联和聚合的区别主要在语义上,关联的两个对象之间通常是平等的,例如你是个人朋友,聚合则通常不是平等的。
(3)关联是一种结构化的关系,指一种对象和另外一种对象有联系。
(4)关联和聚合是视问题域而定的,例如在关心汽车的领域里,轮胎是必定要组合在汽车类中的,由于它离开了汽车就没有意义了。可是在卖轮胎的店铺业务里,就算轮胎离开了汽车,它也是有意义的,这就能够用聚合了。
3.关联和依赖
(1)关联关系中,体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,好比我和个人朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,通常是长期性的,并且双方的关系通常是平等的。
(2)依赖关系中,能够简单的理解,就是一个类A使用到了另外一个类B,而这种使用关系是具备偶然性的、临时性的、很是弱的,可是B类的变化会影响到A。
4.综合比较
这几种关系都是语义级别的,因此从代码层面并不能彻底区分各类关系;但总的来讲,后几种关系所表现的强弱程度依次为:
组合>聚合>关联>依赖