识别此代码的设计模式

时间:2013-11-27 18:43:42

标签: c# design-patterns

任何人都可以帮助我确定以下代码段中使用的设计模式或模式。它看起来不像是一半策略模式,但使用泛型。它只是一个示例代码,并非来自实际的代码库或其他东西。

我之所以说它看起来像一个策略模式,是因为它似乎正在使用诸如DogController<DogRepository>之类的控制器中的泛型来改变行为逻辑。它可能就像animalController.Repository = new DogRepository()

void Main()
{
    var animalController = new DogController();
    animalController.PrintName();
}

abstract class AnimalControllerBase<TRepository> where TRepository : IAnimalRepository
{
    protected abstract TRepository AnimalRepository {get;}

    public void PrintName()
    {
        Console.WriteLine(AnimalRepository.Get());
    }
}

class DogController : AnimalControllerBase<DogRepository>
{
    protected override DogRepository AnimalRepository
    {
        get
        {
            return new DogRepository();
        }
    }
}

class CatController : AnimalControllerBase<CatRepository>
{
    protected override CatRepository AnimalRepository
    {
        get
        {
            return new CatRepository();
        }
    }
}

interface IAnimalRepository
{
    string Get();
}

class DogRepository : IAnimalRepository
{
    public string Get()
    {
        return "Hello, I am Steve the dog..";
    }
}

class CatRepository : IAnimalRepository
{
    public string Get()
    {
        return "Hello, I am Michael the cat..";
    }
}

1 个答案:

答案 0 :(得分:1)

我说这是伪装的Factory Method模式。 AnimalControllerBase定义工厂方法模式的接口,即protected abstract TRepository AnimalRepository {get;},每个子类或具体的工厂方法实现提供实际的创建代码:

// disguise of a concrete Factory Method implementation that creates instances of 
// DogRepository and every time you call get you get a new instance
class DogController : AnimalControllerBase<DogRepository>
{
   protected override DogRepository AnimalRepository
   {
       get
       {
           return new DogRepository();
       }
   }
}

为什么不采取策略? OO结构类似但在概念上非常不同。策略“参数化”行为,而这里有实例创建参数化。实际上,大多数设计模式归结为几个OO结构,例如代理与装饰器完全相同的OO结构,但在概念上它们是非常不同的。