根据子类类型定位依赖项(策略,存储库等)

时间:2011-04-06 08:34:38

标签: design-patterns

想象一下,我有以下继承结构:

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)。

是否有一种模式可以帮助更有效地管理这些继承结构?

2 个答案:

答案 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,但它们与相关的子类密切相关。