泛化关系(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);
}
}