当我想避免使用大型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;但我不确定这是否准确。我从来没有在我自己的代码之外看过它。
它有名字吗?
答案 0 :(得分:1)
这让我感觉它应该是一个抽象的工厂模式:
提供用于创建相关或从属系列的界面 没有指定具体类的对象。
然后,您将拥有一个AnimalFactory,每种动物类型都有不同的GetMethods。 我想你可以有一个通用的get方法,但这会破坏抽象工厂的目的。由于你以任何方式受限于enum,为什么每种类型都没有方法。
有关详细信息,请参阅http://www.dofactory.com/Patterns/PatternAbstract.aspx
答案 1 :(得分:0)
我认为这只是抽象工厂模式的变体。剩下要做的唯一事情是让AnimalAggregator
扩展IAnimalFactory
界面并更改客户端代码以依赖IAnimalFactory
而不是AnimalAggregator
。
public inteface IAnimalFactory
{
IAnimal Get(AnimalType t);
}