泛化关系(generalization)

类继承结构通常表现为,泛化(generalize)与实现(realize)

  • 继承关系为is-a的关系;两个对象之间如果可以用is-a来表示,就是继承关系:(.....是.....)

自行车是车;猫是动物

  • 泛化关系;可以理解为从宏观到微观。

人可以泛化为男人和女人,方向可以泛化为东方、西方、南方、北方,当然可以更具体。

  • 代码上的体现,泛化关系表现为继承非抽象类(non-abstract class)
public class People{....}
public class Male extend People{....}
public class Female extend People{....}

实现关系(realize)

一个抽象的概念,不能直接定义使用,如“笔”是一个抽象的概念无法直接用来定义对象,只有指明具体的类型才可以用来定义对象,如“钢笔”、“铅笔”、“圆珠笔”等。在实际代码中C++Java都有抽象类,Java中还有接口这个概念。

  • 代码实现这种关系:表现为,继承抽象类或实现接口。
public abstract class Write {.....}
public class Pen extend Write {.....}
public class Pencil extend Write {.....}

聚合关系(aggregation)

聚合关系用于表示实体对象之间的关系,表示整体由部分构成,例如班级由学生构成,整体不与部分强依赖也就是说即使放假了班级解散了,但是学生还在。

  • 代码实现
public class ClassGrade {
  private Student student;
}
public class Student {.....}

组合关系(composition)

与聚合关系不同组合关系是一种强依赖的聚合关系,如果整体不在了,那么部分也就随之消失了。

例如人的手有五根手指组成,如果手没了,剩下你自己想吧........

  • 代码实现
public class Hand {
  private One one;
  private Two two;
  private Three three;
  private Four four;
  private Five five;
}

关联关系(association)

它描述不同类的对象之间的结构关系;它是一种静态关系, 通常与运行状态无关,一般由常识等因素决定的;它一般用来定义对象之间静态的、天然的结构; 所以,关联关系是一种“强关联”的关系;例如学生与学校之间的关系

  • 在最终代码中,关联对象通常是以成员变量的形式实现的;
public class Student {
  .....
  private School school;
  .....
}

依赖关系(dependency)

与关联关系不同的是,它是一种临时性的关系,通常在运行期间产生,并且随着运行时的变化; 依赖关系也可能发生变化;

依赖是有方向的,双向依赖是一种非常糟糕的结构,我们总是应该保持单向依赖,杜绝双向依赖的产生;在最终代码中,依赖关系体现为类构造方法及类方法的传入参数,箭头的指向为调用关系;依赖关系除了临时知道对方外,还是“使用”对方的方法和属性;其实就是一种类初始化或参数调用的关系。

/*
 * class init
 */
public class Student {
  private String name;
  private String sex; 
  public Student(String name, String sex){
    this.name = name;
    this.sex = sex;
  }
}

/*
 * method invocation 
 */
public class Main{
  public static int additive (int x, int y){
    return x + y;
  } 
  public static void main (String[] args){
    int result = additive(100, 100);
    System.out.print(result);
  }
}