欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

对象关系之聚合关系

程序员文章站 2022-10-04 18:27:28
概念背景 现实世界中的实体被看成对象,对象之间可能存在着联系或关系,基于对象之间可能存在的关系,引入了对象关系的概念。 对象关系的定义 对象之间存在的关系称为对象关系。 对象关系的分类 根据对象之间存在的关系的性质,对象关系分为 1)关联关系 2)聚合关系 3)继承关系 其中聚合关系又可分为 1)组 ......

概念背景

现实世界中的实体被看成对象,对象之间可能存在着联系或关系,基于对象之间可能存在的关系,引入了对象关系的概念。

对象关系的定义

对象之间存在的关系称为对象关系。

对象关系的分类

根据对象之间存在的关系的性质,对象关系分为

1)关联关系

2)聚合关系

3)继承关系

其中聚合关系又可分为

1)组合关系

2)非组合关系

 

下面较详细地介绍一下聚合关系及其来源。

聚合关系

什么是聚合?什么是组合?什么是非组合?

首先来说明它们的概念。

聚合是将几个对象收集在一起生成一个新对象的行为,其特性是聚合的内部对象与聚合的外部对象相对独立。

组合是将几个对象收集在一起生成一个新对象的行为,其特性是聚合的内部对象与聚合的外部对象相对独立,但两者的生命周期一致

非组合是将几个对象收集在一起生成一个新对象的行为,其特性是聚合的内部对象与聚合的外部对象相对独立,但两者的生命周期不一致

可以看到聚合包括组合和非组合,它们三者都有“聚合的内部对象与聚合的外部对象相对独立”的特征,但什么是聚合的内部对象和聚合的外部对象呢?

举个现实世界中的简单的例子,

我们知道,一副棋具由棋子和棋盘两样东西组成,

以对象的角度来看,棋具、棋子和棋盘都是对象,

但是棋具是由棋子和棋盘这两个对象组成的,本身又是一个对象,

这个棋具对象就是一个聚合的外部对象,棋子和棋盘就是聚合的内部对象。

 

一般情况下,聚合指的是非组合。

什么是聚合关系?什么是组合关系?什么是非组合关系?

根据上面的内容,可以归纳出,

聚合关系是聚合的关系,

展开就是

聚合关系就是将几个对象收集在一起生成一个新对象、内部对象与外部对象相对独立的关系。

同理,

组合关系是组合的关系,

非组合关系是非组合的关系。

有什么用?

在软件工程中,面向对象程序设计方法是解决复杂问题的常用方法。

面向对象程序设计方法的内容包括:

1)对对象进行建模

2)对对象之间的联系或关系进行建模

于是,对对象之间的关系进行建模是软件工程中使用面向对象程序设计方法解决问题各阶段需要经历的过程。

掌握对象之间的关系能够帮助开发者对对象之间的关系建模

实例

实例采用python语言实现。

# 对象之间的组合关系建模
class cpu:
    def __init__(self):
        self.core = 4
class computer:
    def __init__(self):
        self.cpu = cpu()

cp = computer()
print(cp.cpu.core)
del cp

由以上代码可以知道, 当创建一个computer类的实例时,同时会创建一个cpu类的实例,并且它们的生命周期一致,即它们是组合的。

当删除创建的computer类的实例时,也会删除同时创建的cpu类的实例。

这也反映了一定的现实:当计算机对象存在时,处理器对象必定和计算机对象组合地存在。

# 对象之间的聚合关系建模
class chesspieces:
    def __init__(self):
        self.number = 32
class chessboard:
    def __init__(self):
        self.texture = 'marble'
class chessset:
    def __init__(self, chesspieces, chessboard):
        self.chesspieces = chesspieces
        self.chessboard = chessboard

cp = chesspieces()
cb = chessboard()
cs = chessset(cp,cb)
print(cs.chesspieces.number, cs.chessboard.texture)
del cs
print(cp.number, cb.texture)

由以上代码可以知道,当创建一个chessset类的实例时,必须先创建一个chesspieces类的实例和一个chessboard类的实例,再将它们聚合成一个chessset类的实例。

创建的chessset类的实例和创建的chesspieces类的实例和创建的chessboard类的实例的生命周期可能不同。

当删除创建的chessset类的实例时,并不会删除创建的chesspieces类的实例和创建的chessboard类的实例。