是否可以将策略模式用于没有共同祖先的数据结构?

时间:2009-08-03 20:29:44

标签: c# design-patterns refactoring strategy-pattern

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

  • 动物:有一个属性“int Age”
  • 人:有一个属性“DateTime Birthday”

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

的小上传方法
   foreach (TypeName typeName in Enum.GetValues(typeof(TypeName)))
   {
      IDataPopulator populator = 
            new DataFactory().CreateDataPopulator(typeName);
         populator.Populate(string.Empty);
   }

但问题是,populator返回不同类型的对象实例,我试图封装它们,因为它们没有公共属性。 (IDataPopulator.TResult在下面的代码中填充(字符串数据))

有没有办法解决这个问题?或者战略模式不适合这种情况?

以下是我一直在使用的代码

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...");
    }
}

2 个答案:

答案 0 :(得分:1)

我认为你所追求的是序列化,如果你只是存储blob,或者是ORM框架。

答案 1 :(得分:1)

我没有看到战略模式如何适合这里。该模式涉及一系列算法,例如破线策略。你这里没有策略,你有一个抽象的方法

TResult Populate(string data);

以及它的几个实现。

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