0

2つのデータ構造クラスがあります(これは私のコードの簡略化されたバージョンです)

  • 動物:「intAge」というプロパティが1つあります
  • 人物:「DateTimeBirthday」というプロパティが1つあります</ li>

私が達成しようとしているのは、すべての異なるデータ構造クラスに共通する「アップロード」(データベースに永続化)をコンパイルすることです。したがって、主に私の目標は、次のような小さなUploadメソッドを使用することです。

   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

Strategy パターンがここにどのように適合するかわかりません。このパターンは、改行戦略などの一連のアルゴリズムに関するものです。ここには戦略はありません。単一の抽象メソッドがあります

TResult Populate(string data);

そしてそれのいくつかの実装。

私も最初の問題を理解していません。おそらく、いくつかのシリアル化操作をキューに入れたいですか?その場合、コマンド パターンはあなたの味方です。

于 2009-08-03T21:43:56.750 に答える