这个聚合设计模式有名称吗?

时间:2014-04-11 14:28:56

标签: c# oop design-patterns

当我想避免使用大型switch语句时,我经常发现自己使用以下模式(请原谅hackneyed' animal'主题):

public enum AnimalType { Dog, Cat, Hamster }

public interface IAnimal
{
    AnimalType AnimalType { get; }
}

public class Cat : IAnimal
{
    public AnimalType AnimalType { get { return AnimalType.Cat; } }
}

public class AnimalAggregator
{
    private readonly IDictionary<AnimalType, IAnimal> _animals;

    public AnimalAggregator(IEnumerable<IAnimal> animals)
    {
        _animals = animals.ToDictionary(a => a.AnimalType);
    }

    public IAnimal Get(AnimalType animalType)
    {
        IAnimal animal;
        return _animals.TryGetValue(animalType, out animal) ? animal : null;
    }
}

在上面的示例中,我将依赖AnimalAggregator并允许IoC容器连接所有IAnimal的注入。然后,我不是写出一个大的switch语句来检索与IAnimal相关联的AnimalType.Cat,而是拨打animalAggregator.Get(AnimalType.Cat)

我在我的项目中多次使用过这种模式(及其变体),但从来不知道该怎么称呼它 - 我倾向于使用&#34;聚合器&#34;但我不确定这是否准确。我从来没有在我自己的代码之外看过它。

它有名字吗?

2 个答案:

答案 0 :(得分:1)

这让我感觉它应该是一个抽象的工厂模式:

  

提供用于创建相关或从属系列的界面   没有指定具体类的对象。

Abstract pattern diagram

然后,您将拥有一个AnimalFactory,每种动物类型都有不同的GetMethods。 我想你可以有一个通用的get方法,但这会破坏抽象工厂的目的。由于你以任何方式受限于enum,为什么每种类型都没有方法。

有关详细信息,请参阅http://www.dofactory.com/Patterns/PatternAbstract.aspx

答案 1 :(得分:0)

我认为这只是抽象工厂模式的变体。剩下要做的唯一事情是让AnimalAggregator扩展IAnimalFactory界面并更改客户端代码以依赖IAnimalFactory而不是AnimalAggregator

public inteface IAnimalFactory
{
    IAnimal Get(AnimalType t);
}