面向对象设计中类的关系
2018-04-09 本文已影响0人
進无尽
所谓的设计正是采用恰当的方式组织类关。因此谈设计我认为首先要从类之间的关系开始说起.
在java开发中,有很多时候我们是在不断的处理类与类之间关系,其中这六种关系是:
依赖、关联、聚合、组合、继承、实现,他们的耦合度依次增强,
其在UML的表示如下:
1.依赖(Dependence)
比如在实际生活中我们做一件事情都需要借助其他物体的帮助,换句话说,
我们依赖于其他的物体生活。比如:人要开车。依赖也是最普遍和常见的关系。
在代码层次上,依赖关系多表现为函数的参数.
public class Person{
public void drive(Car car){
//
}
}
2.关联 (Association)
如果说依赖关系讲求的临时性,偶然性的话,那么关联关系则是一种持久性的关系。
与依赖关系不同,关联对象的双方地位同级,存在长期,固定的对应关系,即关联是一种强依赖。
关联关系共分为两种:单向关联和双向关联。
所谓单向关联通俗点讲就是“你中有我,但我中未必有你”,比如小明拥有一辆车(注意和小明开车进行区分),但车这个对象可不拥有你。
和单向关联相对应的是双向关联,也即是”你中有我,我中有你”,比如夫妻就是一种双向关联.
在代码层次上,关联关系表现为对象作为另一个类的成员变量.
单向关联
public class Person{
private Car car;
public void setCar(Car car){
this.car=car;
}
}
双向关联
public class Husband{
private Wife wife=new Wife();
public void say(){
System.out.println("my wife name:"+wife.getName());
}
}
public class Wife{
private Husband husband=new Husband();
public void say(){
System.out.println("my husband name:"+husband.getName());
}
}
3.聚合(Aggregation)
聚合关系是一种强关联关系,两者之间最主要的区别是在语意上:聚合之间的关系更像是”整体-部分”,有点组装的含义,
而关联关系的对象间是相互独立的,不存在组装关系.
比如:在现实世界中,分子是由原子组成的,汽车是由各种零部件组成的等,这都是聚合关系的最好说明.
这里要注意,组成A类型分子的原子也可以组成B类型的分子,这说明什么呢?
也就是部分可以单独存在,换句话说就是整体和部分两者的生命周期不是同步的.
比如:水分子是由氧原子和氢原子组成的,你不能说没有水分子就没有氧原子和氢原子吧.
在代码层次上,聚合和关联两者的形式一致,都表现为成员变量.
public class Car{
private Tyre tyre;
private Engine engine;
public void setTyre(Tyre tyre){
this.tyre=tyre;
}
public void setEngine(Engine engine){
this.engine=engine;
}
}
image.png
4.组合(Composition)
组合和聚合非常类似,都表示的”整体-部分”,“整体”负责“部分”的生命周期,他们之间是共生共死的;
并且“部分”单独存在时没有任何意义。
不难发现,组合是一种强聚合关系.比如,人这个生命体由不同器官构成,其中我们拿心脏来说一下,
人要活着必须依靠心脏,心脏不能脱离人这个生命体,两者一旦分开,都会死亡.
在代码层次上,通常表现为类的成员变量,除此之外还要求这个成员变量在构造函数中创建.
public class People{
private Heart heart;
public People(){
heart=new Heart();
}
}
image.png
5.继承(Generalization)
继承表示类与类(或者接口与接口)之间的父子关系。在java中,用关键字extends表示继承关系。
6.实现(Implementation)
表示一个类实现一个或多个接口的方法。接口定义好操作的集合,由实现类去完成接口的具体操作。在java中使用implements表示。