我有两个数据结构类(这是我的代码的简化版本)
我想要完成的是编译“上传”(持久化到数据库),这在所有不同的数据结构类中是通用的。 所以主要我的目标是有一个看起来像
的小上传方法 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...");
}
}
答案 0 :(得分:1)
我认为你所追求的是序列化,如果你只是存储blob,或者是ORM框架。
答案 1 :(得分:1)
我没有看到战略模式如何适合这里。该模式涉及一系列算法,例如破线策略。你这里没有策略,你有一个抽象的方法
TResult Populate(string data);
以及它的几个实现。
我也不了解最初的问题,也许你想排队几个序列化操作?在这种情况下,Command模式是你的朋友。