Можно ли использовать шаблон Стратегии для структуры данных без общего предка? - PullRequest
0 голосов
/ 04 августа 2009

У меня есть два класса структуры данных (это упрощенная версия моего кода)

  • Животное: имеет одно свойство «int Age»
  • Персона: имеет одно свойство «Дата рождения»

То, что я пытаюсь сделать, это скомпилировать «Uploading» (сохраняемый в базу данных), который является общим для всех различных классов структуры данных. Поэтому в основном моя цель состоит в том, чтобы иметь небольшой метод Upload, похожий на

   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 ]

1 голос
/ 04 августа 2009

Я не вижу, как шаблон стратегии будет соответствовать здесь. Шаблон о семействе алгоритмов, например, стратегии разрыва строки. У вас нет стратегий, у вас есть один абстрактный метод

TResult Populate(string data);

и несколько его реализаций.

Я также не понимаю первоначальную проблему, может быть, вы хотите поставить в очередь несколько операций сериализации? В этом случае образец Команды - ваш друг.

1 голос
/ 04 августа 2009

Я думаю, что вам нужно либо сериализацию, если вы просто храните BLOB-объекты, либо среду ORM.

...