2009-04-30 104 views
1

我在尋找描述某種情況的模式。也許有人知道的東西,可以給我一個提示尋找特定的設計模式

情況對象的類型A,1:n關聯到類型B的對象。示例:一個人和他的所有寵物。寵物對象有年齡數據成員。現在每個人都應該有一個他的寵物平均年齡的數據成員。我不希望這些信息被保存和加載,但要在加載過程中進行計算(所有必要的信息已經存在,所以這是多餘的,但我想要人物對象中的信息)。

問題那麼我該如何以面向對象的方式做到這一點?有沒有描述這種情況的模式?我的第一個想法是有一個ComputedFieldsUpdater類,它接受一個寵物對象,然後計算所有尚未加載的字段。但我想知道這是否是正確的方式,或者是否可能有更優雅的解決方案?

感謝您的想法。

回答

1

如果您爲關聯創建類來鍵入B,它非常簡單:無論如何您都需要某種列表。因此,只需創建一個「PetList」或類似的東西,它有一個方法「averageAge()」,它可以從它的所有寵物計算出這個值。

現在您可以通過致電person.getPets().averageAge()訪問平均值。

從面向對象的角度來看,關於平均值的信息不應該直接在Person對象中。

+0

甚至更​​好的平均然後可以被緩存,而不是每次都重新計算 – MahdeTo 2009-04-30 05:59:51

+0

「從一個面向對象的點關於平均值的信息不應在Person直接無論如何。「 - 我對此不太確定。通常在OOP中,一些代碼想要請某個類來執行計算 - 而不用擔心數據的內部或中間表示。我認爲像person.getPetsAverageAge()這樣的東西會是一個合適的方法。 – harto 2009-04-30 06:56:44

0

它不是一個四人組的設計模式,但普遍接受的解決方案,當它是絕對必要的存儲冗餘計算的數據是延遲加載它,然後保持一個布爾值來描述是否它仍然有效。

換句話說:

class Person 
{ 
List<Pet> myPets; 
float averageAge; 
boolean isAgeValid = false; 

float getAverageAge() 
{ 
    if(isAgeValid) 
     return averageAge; 
    else 
     ...calculate age, save it in averageAge, set bool to true, and return derived float... 
} 

//all list operations should mark the bool false 
void Add(Pet p) 
{ 
    myPets.Add(p); 
    isAgeValid=false; 
} 
}