设计模式剖析系列之UML类关系

By heiry on 2019-08-04 [ in 技术 ]

设计模式实质上并没有新的东西,只是一种思想体现,来来去去都是在围绕继承、多态、静态之间做文章。很多人学设计模式很吃力,被其中类之间复杂的引用关系绕晕,我认为掌握设计模式最重要的一步就是把常见类之间关系梳理出来,而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

类与接口的关系,面向对象中最基础的关系,在此不再详解。

 >>

京ICP备15064511号 © 2009-2017 MOSANG.NET DESIGNED BY HEIRY WU