我正在寻找描述某种情况的模式。也许有人知道一些事情,可以给我一个提示
情境类型A的对象,1:n与B类对象的关联。示例:一个人及其所有宠物。宠物对象具有年龄数据成员。现在每个人都应该有一个数据成员,以了解他的宠物的平均年龄。我不希望保存和加载这些信息,但要在加载过程中计算(所有必要的信息已经存在,所以它有点冗余,但我想要person对象中的信息)。
问题那么我怎样才能以面向对象的方式做到这一点?是否有描述这种情况的模式?我的第一个想法是让一个ComputedFieldsUpdater类接受一个pet对象,然后计算所有尚未加载的字段。但我想知道这是否是正确的方法,或者是否有更优雅的解决方案?
感谢您的想法。
答案 0 :(得分:1)
如果为类型B的关联创建一个类,则相当简单:无论如何,您需要某种列表。所以只需创建一个“PetList”或类似的东西,它有一个方法“averageAge()
”,它从所有它的宠物计算这个值。
现在,您可以致电person.getPets().averageAge()
来访问平均值。
从面向对象的角度来看,平均值的信息不应该直接在Person-object中。
答案 1 :(得分:0)
它不是Gang of Four设计模式,但是当绝对必要存储计算冗余的数据时,普遍接受的解决方案是延迟加载它,然后保留一个布尔值值来描述它是否仍然有效。
换句话说:
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;
}
}