Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 根据子类类型定位依赖项(策略、存储库等)_Design Patterns - Fatal编程技术网

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

Design patterns 根据子类类型定位依赖项(策略、存储库等),design-patterns,Design Patterns,假设我有以下继承结构: AnimalsNamespace.Animal CatsNamespace.Cat : Animal DogsNamespace.Dog : Animal 在我的应用程序类中,我发现自己经常面临以下类型的代码: void Feed(Animal animal) { if (animal is Cat) { KernelContainer.Get<ICatFeedingStrategy>().Feed((Cat)animal)

假设我有以下继承结构:

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);
    }
}
无效饲料(动物)
{
如果(动物是猫)
{
KernelContainer.Get().Feed((猫)动物);
}
否则,如果(动物是狗)
{
KernelContainer.Get().Feed((狗)动物);
}
}
这在一段时间内是好的,但在我有了大量的if语句之后。然后,当您请求NHibernate代理的类型等时,我也开始遇到NHibernate代理行为异常的问题,事情变得一团糟

我可以建立一个工厂类,但我最终会遇到一大堆复杂的问题,就像我必须要养猫一样:ICatFeedingStrategy、ConcreteCatFeedingStrategy、IAnimalFeedingStrategyFactory、ConcreteAnimalFeedingStrategyFactory。。。(通常加上抽象基类,如AnimalFeedingStrategyBase)


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

现在,您正在针对具体类进行编程,而您实际上应该针对接口进行编程

上面的例子可以通过以下方式解决。现在,提要方法可能如下所示:

void Feed(Animal animal)
{
    var strategy = this.factory.GetFeedingStrategy(animal);
    strategy.Feed(animal);
}
其中,
工厂
是注入式IFeedingStrategyFactory


当您有一个已知子类型的有限列表时,另一个选项是使用。

也许a在这里会有所帮助。首先,每个“进料器”在链中注册自身。然后,
feed()
调用链中的第一个“进料器”。每个feeder都知道如何为自己的子类提供feed。您仍然有许多
if
-s,但是它们与相关的子类紧密耦合。

相反,我的示例中充满了接口。我还在第四段中提到了工厂。抽象工厂并没有消除多个
if
-s@yegor256:但它会将代码从多个if更糟糕的地方移开。