Повторный шаблон дизайна свойств - PullRequest
2 голосов
/ 01 мая 2010

У меня есть класс DownloadManager, который управляет несколькими DownloadItem объектами. Каждый DownloadItem имеет такие события, как ProgressChanged и DownloadCompleted. Обычно вы хотите использовать один и тот же обработчик событий для всех загружаемых элементов, поэтому немного раздражает необходимость снова и снова устанавливать обработчики событий для каждого DownloadItem.

Таким образом, мне нужно решить, какой шаблон использовать:

  1. Используйте один DownloadItem в качестве шаблона и клонируйте его при необходимости

        var dm = DownloadManager();
        var di = DownloadItem();
        di.ProgressChanged += new DownloadProgressChangedEventHandler(di_ProgressChanged);
        di.DownloadCompleted += new DownloadProgressChangedEventHandler(di_DownloadCompleted);
        DownloadItem newDi;
        newDi = di.Clone();
        newDi.Uri = "http://google.com";
        dm.Enqueue(newDi);
        newDi = di.Clone();
        newDi.Uri = "http://yahoo.com";
        dm.Enqueue(newDi);
    
  2. Вместо этого установите обработчики событий на DownloadManager и попросите его скопировать события в каждый DownloadItem, который находится в очереди.

        var dm = DownloadManager();
        dm.ProgressChanged += new DownloadProgressChangedEventHandler(di_ProgressChanged);
        dm.DownloadCompleted += new DownloadProgressChangedEventHandler(di_DownloadCompleted);
        dm.Enqueue(new DownloadItem("http://google.com"));
        dm.Enqueue(new DownloadItem("http://yahoo.com"));
    
  3. Или использовать какую-то фабрику

        var dm = DownloadManager();
        var dif = DownloadItemFactory();
        dif.ProgressChanged += new DownloadProgressChangedEventHandler(di_ProgressChanged);
        dif.DownloadCompleted += new DownloadProgressChangedEventHandler(di_DownloadCompleted);
        dm.Enqueue(dif.Create("http://google.com"));
        dm.Enqueue(dif.Create("http://yahoo.com"));
    

Что бы вы порекомендовали?

Ответы [ 2 ]

2 голосов
/ 01 мая 2010

Почему DownloadItems отвечают за отчеты о прогрессе (с точки зрения разработки API)?

Я бы сказал, что DownloadManager отвечает за загрузку DownloadItems и, следовательно, также за отчет о проделанной работе. (Внутренняя стратегия реализации может, конечно, отличаться.)

Я бы выбрал второй вариант:

var dm = DownloadManager
{
    "http://google.com",
    new DownloadItem("http://yahoo.com") { Retries = 5 }
};

dm.ProgressChanged += (sender, e) =>
    Console.WriteLine("Download {0}: {1:P}", e.Uri, (double)e.Progress / 100.0);

dm.DownloadCompleted += (sender, e) =>
    Console.WriteLine("Download {0}: completed!", e.Uri);

dm.DownloadAllCompleted += (sender, e) =>
    Console.WriteLine("All downloads completed!");

dm.Add("http://stackoverflow.com");
dm.DownloadAllAsync();

Если у вас есть копия Руководства по проектированию платформы (2-е изд.), Посмотрите страницы 305-312 (Асинхронный шаблон на основе событий).

1 голос
/ 01 мая 2010

Я бы сказал, что шаблонный метод шаблона с фабрикой будет правильным подходом для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...