美文网首页
面向对象设计中类的关系

面向对象设计中类的关系

作者: 進无尽 | 来源:发表于2018-04-09 16:03 被阅读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表示。

相关文章

网友评论

      本文标题:面向对象设计中类的关系

      本文链接:https://www.haomeiwen.com/subject/wnsihftx.html