设计模式实质上并没有新的东西,只是一种思想体现,来来去去都是在围绕继承、多态、静态之间做文章。很多人学设计模式很吃力,被其中类之间复杂的引用关系绕晕,我认为掌握设计模式最重要的一步就是把常见类之间关系梳理出来,而UML早已经帮我们做了,拿来理顺即可。
一. 依赖关系Dependency
依赖关系是一种临时关系、使用的弱关系,是耦合度最低的一种关系。
代码表现:一个类的方法通过局部变量、方法的参数或者对静态方法的调用来访问另一个类(被依赖类)。下例中,猎人(Hunter)和枪(Gun)之间是一种使用关系,猎人使用枪进行射击,枪Gun作为一个参数出现在猎人shoot方法中(Hunter类中猎杀动作shoot()调用了Gun实例的开火fire()方法):
package com.mosang.umlmodule; public class Hunter { private String name; public void shoot(Gun g) { g.fire(); } }
package com.mosang.umlmodule; public class Gun { private String brand; public void fire() { System.out.println("shoot....."); } }
package com.mosang.umlmodule; public class Client { public static void main(String[] args) { Hunter hunter = new Hunter(); hunter.shoot(new Gun()); } }
UML图示:
二. 关联关系Association
关联关系是对象之间的一种引用关系,用于表示一类对象与另一类对象之间的联系,如学生与老师、公司与员工、宠物与主人等等,存在一对一,一对多,多对多等关系。
代码表现:一个类的对象作为另一个类的成员变量。下例中学生与老师是一种多对多的关系(一个学生同时有多个老师教,一个老师也同时教多个学生),Student类作为成员变量出现在Teacher类中,Teacher类也作为成员变量出现在Student类中:
package com.mosang.umlmodule; import java.util.List; public class Student { private String name; private List<Teacher> teachers; public void study() { } }
package com.mosang.umlmodule; import java.util.List; public class Teacher { private String name; private List<Student> students; public void teach() { } }
UML图示:
【双向的关联可以用带两个箭头或者没有箭头的实线来表示,单向的关联用带一个箭头的实线来表示,箭头从使用类指向被关联的类。也可以在关联线的两端标注角色名,代表两种不同的角色。】
三. 聚合关系Aggregation
聚合关系是关联关系的一种,是一种整体-部分的单向强关系(has-a),但整体与部分相对独立,如教室与黑板、电脑与硬盘、汽车与轮胎的关系,部分是可以脱离整体独立存在的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。
代码表现:部分类实例作为整体的成员变量
package com.mosang.umlmodule; public class Car { private Tyre tyre; public void run() { } }
package com.mosang.umlmodule; public class Tyre { String brands; public void roll() { } }
四. 组合关系Composition
组合关系也是关联关系的一种,与聚合关系相似,表示的是整体与部分的单向强关系,与聚合关系不同的是,在组合关系中,部分是不能脱离整体而单独存在(contains-a),如人与大脑,学校与班级,双方都不能脱离对方而存在。此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束。
代码表现:在代码层面,与关联关系,聚合关系没有差别。
package com.mosang.umlmodule; public class Person { Brain brain; private void work() { } }
package com.mosang.umlmodule; public class Brain { String eyes; String nose; String mouth; private void thinking() { } }
UML图示:
五. 泛化关系Generalization
指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系,在此不再详解。
六. 实现关系Realization
类与接口的关系,面向对象中最基础的关系,在此不再详解。
>>