UML 类图类的表示方式具体类具体类在类图中用矩形框表示矩形框分为三层第一层是类名字。第二层是类的成员变量第三层是类的方法。成员变量以及方法前的访问修饰符用符号来表示表示public-表示private#表示protected~表示default加方法参数的话格式如下# method2(int par1, String par2): int返回值可以省略不写抽象类抽象类在 UML 类图中同样用矩形框表示但是抽象类的类名以及抽象方法的名字都用斜体字表示接口接口在类图中也是用矩形框表示但是与类的表示法不同的是接口在类图中的第一层顶端用构造型interface表示下面是接口的名字第二层是方法。此外接口还有另一种表示法俗称棒棒糖表示法就是类上面的一根棒棒糖圆圈实线。圆圈旁为接口名称接口方法在实现类中出现。包类和接口一般都出现在包中UML 类图中包的表示形式如下类之间的关系类和类、类和接口、接口和接口之间存在一定关系UML 类图中一般会有连线指明它们之间的关系。关系共有六种类型分别是实现关系、泛化关系、关联关系、依赖关系、聚合关系、组合关系。实现关系实现关系是指接口及其实现类之间的关系。在 UML 类图中实现关系用空心三角和虚线组成的箭头来表示从实现类指向接口。在 Java 代码中实现关系可以直接翻译为关键字implements。泛化关系泛化关系Generalization是指对象与对象之间的继承关系。如果对象 A 和对象 B 之间的 “is a” 关系成立那么二者之间就存在继承关系对象 B 是父对象对象 A 是子对象。例如一个年薪制员工 “is a” 员工很显然年薪制员工 Salary 对象和员工 Employee 对象之间存在继承关系Employee 对象是父对象Salary 对象是子对象。在 UML 类图中泛化关系用空心三角和实线组成的箭头表示从子类指向父类。在 Java 代码中对象之间的泛化关系可以直接翻译为关键字extends。关联关系关联关系Association是指对象和对象之间的连接它使一个对象知道另一个对象的属性和方法。在 Java 中关联关系的代码表现形式为一个对象含有另一个对象的引用。也就是说如果一个对象的类代码中包含有另一个对象的引用那么这两个对象之间就是关联关系。关联关系有单向关联和双向关联。如果两个对象都知道即可以调用对方的公共属性和操作那么二者就是双向关联。如果只有一个对象知道即可以调用另一个对象的公共属性和操作那么就是单向关联。大多数关联都是单向关联单向关联关系更容易建立和维护有助于寻找可重用的类。在 UML 图中双向关联关系用带双箭头的实线或者无箭头的实线双线表示。单向关联用一个带箭头的实线表示箭头指向被关联的对象。这就是导航性Navigatity。一个对象可以持有其它对象的数组或者集合。在 UML 中通过放置多重性multipicity表达式在关联线的末端来表示。多重性表达式可以是一个数字、一段范围或者是它们的组合。多重性允许的表达式示例如下数字精确的数量*或者0..*表示0到多个0..1表示0或者1个在 Java中 经常用一个空引用来实现1..*表示1到多个关联关系又分为依赖关联、聚合关联和组合关联三种类型。依赖关系依赖Dependency关系是一种弱关联关系。如果对象 A 用到对象 B但是和 B 的关系不是太明显的时候就可以把这种关系看作是依赖关系。如果对象 A 依赖于对象 B则A “use a” B。比如驾驶员和汽车的关系驾驶员使用汽车二者之间就是依赖关系。(和驾驶员拥有汽车是不一样的)在 UML 类图中依赖关系用一个带虚线的箭头表示由使用方指向被使用方表示使用方对象持有被使用方对象的引用。依赖关系在 Java 中的具体代码表现形式为 B 为 A 的构造器或方法中的局部变量、方法或构造器的参数、方法的返回值或者 A 调用 B 的静态方法。代码演示如下classB{publicStringfield1;//成员变量publicvoidmethod1(){System.println(在类B的方法1中);}publicstaticvoidmethod2(){//静态方法System.out.println(在类B的静态方法2中);}}publicclassA{publicvoidmethod1(){// A 依赖于 B 的第一种表现形式B 为 A 的局部变量BbnewB();b.method1();}publicvoidmethod2(){// A 依赖于 B 的第二种表现形式 调用 B 的静态方法B.method2();}publicvoidmethod3(Bb){// A 依赖于 B 的第三种表现形式B 作为 A 的方法参数Stringsb.field1;}// A 依赖于 B 的第四种表现形式B 作为 A 的方法的返回值publicBmethod4(){returnnewB();}}聚合关系聚合Aggregation是关联关系的一种特例它体现的是整体与部分的拥有关系即has a的关系。此时整体与部分之间是可分离的它们可以具有各自的生命周期部分可以属于多个整体对象也可以为多个整体对象共享所以聚合关系也常称为共享关系。例如公司部门与员工的关系一个员工可以属于多个部门一个部门撤消了员工可以转到其它部门。又或者前面说的驾驶员拥有车。在 UML 图中聚合关系用空心菱形加实线箭头表示空心菱形在整体一方箭头指向部分一方组合关系组合Composition也是关联关系的一种特例它同样体现整体与部分间的包含关系即contains a的关系。但此时整体与部分是不可分的部分也不能给其它整体共享作为整体的对象负责部分的对象的生命周期。这种关系比聚合更强也称为强聚合。如果 A 组合 B则 A 需要知道 B 的生存周期即可能 A 负责生成或者释放 B或者 A 通过某种途径知道 B 的生成和释放。例如人包含头、躯干、四肢它们的生命周期一致。当人出生时头、躯干、四肢同时诞生。当人死亡时作为人体组成部分的头、躯干、四肢同时死亡。在 UML 图中组合关系用实心菱形加实线箭头表示实心菱形在整体一方箭头指向部分一方。在 Java 代码形式上聚合和组合关系中的部分对象是整体对象的一个成员变量。但是在实际应用开发时两个对象之间的关系到底是聚合还是组合有时候很难区别。在 Java 中仅从类代码本身是区分不了聚合和组合的。如果一定要区分那么如果在删除整体对象的时候必须删掉部分对象那么就是组合关系否则可能就是聚合关系。从业务角度上来看如果作为整体的对象必须要部分对象的参与才能完成自己的职责那么二者之间就是组合关系否则就是聚合关系。例如汽车与轮胎汽车作为整体轮胎作为部分。如果用在二手车销售业务环境下二者之间就是聚合关系。因为轮胎作为汽车的一个组成部分它和汽车可以分别生产以后装配起来使用但汽车可以换新轮胎轮胎也可以卸下来给其它汽车使用。如果用在驾驶系统业务环境上汽车如果没有轮胎就无法完成行驶任务二者之间就是一个组合关系。再比如网上书店业务中的订单和订单项之间的关系如果订单没有订单项也就无法完成订单的业务所以二者之间是组合关系。而购物车和商品之间的关系因为商品的生命周期并不被购物车控制商品可以被多个购物车共享因此二者之间是聚合关系。参考 30分钟学会UML类图