2009-04-30 79 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; 
} 
}