0

我有两个数据结构类(这是我的代码的简化版本)

  • 动物:有一个属性“int Age”
  • 人:拥有一个属性“DateTime Birthday”</li>

我想要完成的是编译“上传”(持久化到数据库),这在所有不同的数据结构类中都很常见。所以主要是我的目标是有一个小的上传方法,看起来像

   foreach (TypeName typeName in Enum.GetValues(typeof(TypeName)))
   {
      IDataPopulator populator = 
            new DataFactory().CreateDataPopulator(typeName);
         populator.Populate(string.Empty);
   }

但问题是,populator返回一个不同类型的对象实例,我试图封装它,因为它们没有共同的属性。(下面代码中的 IDataPopulator.TResult Populate(string data))

有没有办法解决这个问题?还是策略模式不适合这种情况?

这是我一直在使用的代码

public class Program
{
    public static void Main()
    {
        foreach (TypeName typeName in Enum.GetValues(typeof(TypeName)))
        {
            IDataPopulator populator = new DataFactory().CreateDataPopulator(typeName);
            populator.Populate(string.Empty);
        }
    }
}

public enum TypeName { Person, Animal }
public class Person { public DateTime Birthday { get; set; } }
public class Animal { public int Age { get; set; } }

public interface IDataPopulator
{
    TResult Populate(string data);
}

class AnimalDataPopulator : IDataPopulator
{
    public Animal Populate(string data)
    {
        // create an instance of Animal using data
    }
}

class PersonDataPopulator : IDataPopulator
{
    public Person Populate(string data)
    {
        // create an instance of Person using data
    }
}

public class DataFactory
{
    public IDataPopulator CreateDataPopulator(TypeName typeName)
    {
        switch (typeName)
        {
            case TypeName.Person:
                return new PersonDataPopulator();
            case TypeName.Animal:
                return new AnimalDataPopulator();
            default:
                throw new ArgumentOutOfRangeException("typeName");
        }
    }
}

public class UploadContext
{
    private readonly IUploader _Uploader;
    public UploadContext(IUploader uploader) { _Uploader = uploader; }
    public void Upload() { _Uploader.Upload(); }
}

public interface IUploader
{
    void Upload();
}

class PersonUploader : IUploader
{
    private Person _Person;
    public PersonUploader(Person person) { _Person = person; }
    public void Upload()
    {
        Console.WriteLine("Uploading person...");
    }
}
class AnimalUploader : IUploader
{
    private Animal _Animal;
    public AnimalUploader(Animal animal) { _Animal = animal; }
    public void Upload()
    {
        Console.WriteLine("Uploading animal...");
    }
}
4

2 回答 2

1

我认为您所追求的是序列化(如果您只是存储 blob)或 ORM 框架。

于 2009-08-03T20:33:23.460 回答
1

我看不出策略模式如何适合这里。该模式是关于一系列算法的,例如换行策略。你这里没有策略,你只有一个抽象方法

TResult Populate(string data);

以及它的几个实现。

最初的问题我也不太明白,也许你想排队几个序列化操作?在这种情况下,命令模式是你的朋友。

于 2009-08-03T21:43:56.750 回答