这是一个常见的情况,总是让我感到沮丧。
我有一个带有父对象的对象模型。父级包含一些子对象。这样的事情。
public class Zoo
{
public List<Animal> Animals { get; set; }
public bool IsDirty { get; set; }
}
每个子对象都有各种数据和方法
public class Animal
{
public string Name { get; set; }
public int Age { get; set; }
public void MakeMess()
{
...
}
}
当子级更改时(在这种情况下,当调用MakeMess方法时),父级中的某些值需要更新。假设当Animal的某个阈值变得混乱时,则需要设置Zoo的IsDirty标志。
有几种处理这种情况的方法(我知道)。
1)每个动物都可以有一个父Zoo参考,以便交流更改。
public class Animal
{
public Zoo Parent { get; set; }
...
public void MakeMess()
{
Parent.OnAnimalMadeMess();
}
}
这似乎是最糟糕的选择,因为它将Animal耦合到其父对象。如果我想要一个住在房子里的动物怎么办?
2)如果您使用的是支持事件的语言(例如C#),则另一个选择是让父级订阅更改事件。
public class Animal
{
public event OnMakeMessDelegate OnMakeMess;
public void MakeMess()
{
OnMakeMess();
}
}
public class Zoo
{
...
public void SubscribeToChanges()
{
foreach (var animal in Animals)
{
animal.OnMakeMess += new OnMakeMessDelegate(OnMakeMessHandler);
}
}
public void OnMakeMessHandler(object sender, EventArgs e)
{
...
}
}
这似乎可行,但是根据经验很难维护。如果动物更改了动物园的动物,则必须在旧动物园取消订阅事件,然后在新动物园重新订阅。随着组成树的深入,这只会变得更糟。
3)另一个选择是将逻辑上移到父级。
public class Zoo
{
public void AnimalMakesMess(Animal animal)
{
...
}
}
这似乎非常不自然,并导致逻辑重复。例如,如果我有一个不与Zoo共享任何公共继承父级的House对象。
public class House
{
// Now I have to duplicate this logic
public void AnimalMakesMess(Animal animal)
{
...
}
}
我尚未找到处理这些情况的好策略。还有什么可用的?如何使它更简单?