想象一下,我有以下继承结构:
AnimalsNamespace.Animal
CatsNamespace.Cat : Animal
DogsNamespace.Dog : Animal
在我的应用程序类中,我发现自己面临以下类型的代码:
void Feed(Animal animal)
{
if (animal is Cat)
{
KernelContainer.Get<ICatFeedingStrategy>().Feed((Cat)animal);
}
else if (animal is Dog)
{
KernelContainer.Get<IDogFeedingStrategy>().Feed((Dog)animal);
}
}
这一段时间没有问题,但是在我有大量这些if语句之后。然后我也开始遇到NHibernate代理的问题,当你请求他们的类型等事情变得一团糟时表现得很奇怪。
我可以构建一个Factory类,但最终会产生一大堆复杂性,只需要为我必须拥有的猫提供:ICatFeedingStrategy,ConcreteCatFeedingStrategy,IAnimalFeedingStrategyFactory,ConcreteAnimalFeedingStrategyFactory ......(通常还有一个抽象基类,如同AnimalFeedingStrategyBase)。
是否有一种模式可以帮助更有效地管理这些继承结构?
答案 0 :(得分:0)
现在你正在编写针对具体类的编程,你应该对接口进行编程。
上面的示例可能由using an Abstract Factory to resolve dependencies based on run-time information解决。现在,Feed方法可能如下所示:
void Feed(Animal animal)
{
var strategy = this.factory.GetFeedingStrategy(animal);
strategy.Feed(animal);
}
factory
是注入的IFeedingStrategyFactory。
另一个选项,当你有一个已知子类型的有限列表时,就是使用Visitor pattern。
答案 1 :(得分:0)
也许chain of responsibility可能对此有所帮助。首先,每个“馈线”都在链中注册。然后,feed()
调用链中的第一个“馈线”。每个馈线都知道如何馈送自己的子类。你仍然有很多if
- s,但它们与相关的子类密切相关。