對象關系之聚合關系
概念背景
現實世界中的實體被看成對象,對象之間可能存在著聯系或關系,基於對象之間可能存在的關系,引入了對象關系的概念。
對象關系的定義
對象之間存在的關系稱為對象關系。
對象關系的分類
根據對象之間存在的關系的性質,對象關系分為
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類的實例。
對象關系之聚合關系