zoukankan      html  css  js  c++  java
  • 对象关系之聚合关系

    概念背景

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

    对象关系的定义

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

    对象关系的分类

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

    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类的实例。

  • 相关阅读:
    [转]简单理解php的socket编程
    github 生成token的方法
    win7升级powershell【转】
    PHP的反射机制 【转】
    jquery幻灯片插件slick演示
    织梦生成的时候“你指定的文件名有问题,无法创建文件”解决方案【转】
    dedecms下的tplcache模板缓存[转]
    dede织梦data目录正确迁移及引起的问题解决方法【转】
    C# 判断是否是在设计模式下有效的方法
    C# 操作计算机用户权限
  • 原文地址:https://www.cnblogs.com/creasing/p/10633949.html
Copyright © 2011-2022 走看看