前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面向对象设计中类的关系

面向对象设计中类的关系

作者头像
進无尽
发布2018-09-12 17:52:41
1.5K0
发布2018-09-12 17:52:41
举报
文章被收录于专栏:進无尽的文章進无尽的文章

所谓的设计正是采用恰当的方式组织类关。因此谈设计我认为首先要从类之间的关系开始说起.

在java开发中,有很多时候我们是在不断的处理类与类之间关系,其中这六种关系是: 依赖、关联、聚合、组合、继承、实现,他们的耦合度依次增强, 其在UML的表示如下:

1.依赖(Dependence)

代码语言:javascript
复制
比如在实际生活中我们做一件事情都需要借助其他物体的帮助,换句话说,
我们依赖于其他的物体生活。比如:人要开车。依赖也是最普遍和常见的关系。

在代码层次上,依赖关系多表现为函数的参数.

代码语言:javascript
复制
public class Person{
    public void drive(Car car){
        //
    }
}

2.关联 (Association)

代码语言:javascript
复制
如果说依赖关系讲求的临时性,偶然性的话,那么关联关系则是一种持久性的关系。
与依赖关系不同,关联对象的双方地位同级,存在长期,固定的对应关系,即关联是一种强依赖。

关联关系共分为两种:单向关联和双向关联。

所谓单向关联通俗点讲就是“你中有我,但我中未必有你”,比如小明拥有一辆车(注意和小明开车进行区分),但车这个对象可不拥有你。
和单向关联相对应的是双向关联,也即是”你中有我,我中有你”,比如夫妻就是一种双向关联.

在代码层次上,关联关系表现为对象作为另一个类的成员变量.

单向关联
代码语言:javascript
复制
public class Person{
    private Car car;
    public void setCar(Car car){
        this.car=car;
    }
}
双向关联
代码语言:javascript
复制
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)

代码语言:javascript
复制
聚合关系是一种强关联关系,两者之间最主要的区别是在语意上:聚合之间的关系更像是”整体-部分”,有点组装的含义,

而关联关系的对象间是相互独立的,不存在组装关系. 

比如:在现实世界中,分子是由原子组成的,汽车是由各种零部件组成的等,这都是聚合关系的最好说明.
这里要注意,组成A类型分子的原子也可以组成B类型的分子,这说明什么呢?
也就是部分可以单独存在,换句话说就是整体和部分两者的生命周期不是同步的.
比如:水分子是由氧原子和氢原子组成的,你不能说没有水分子就没有氧原子和氢原子吧.

在代码层次上,聚合和关联两者的形式一致,都表现为成员变量.

代码语言:javascript
复制
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)

代码语言:javascript
复制
组合和聚合非常类似,都表示的”整体-部分”,“整体”负责“部分”的生命周期,他们之间是共生共死的;
并且“部分”单独存在时没有任何意义。
不难发现,组合是一种强聚合关系.比如,人这个生命体由不同器官构成,其中我们拿心脏来说一下,
人要活着必须依靠心脏,心脏不能脱离人这个生命体,两者一旦分开,都会死亡. 

在代码层次上,通常表现为类的成员变量,除此之外还要求这个成员变量在构造函数中创建.

代码语言:javascript
复制
public class People{
    private Heart heart;

    public People(){
        heart=new Heart();
    }
}

image.png

5.继承(Generalization)

代码语言:javascript
复制
继承表示类与类(或者接口与接口)之间的父子关系。在java中,用关键字extends表示继承关系。

6.实现(Implementation)

代码语言:javascript
复制
 表示一个类实现一个或多个接口的方法。接口定义好操作的集合,由实现类去完成接口的具体操作。在java中使用implements表示。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.04.09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.依赖(Dependence)
  • 2.关联 (Association)
    • 单向关联
      • 双向关联
      • 3.聚合(Aggregation)
      • 4.组合(Composition)
      • 5.继承(Generalization)
      • 6.实现(Implementation)
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档