我有一个DownloadManager
类来管理多个DownloadItem
个对象。每个DownloadItem
都有ProgressChanged
和DownloadCompleted
等事件。通常你想为所有下载项使用相同的事件处理程序,所以为每个DownloadItem
反复设置事件处理程序有点烦人。
因此,我需要决定使用哪种模式:
使用一个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);
设置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"));
或使用某种工厂
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"));
你会推荐什么?
答案 0 :(得分:2)
为什么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 :(得分:1)
我会说使用工厂的模板方法模式是正确的方法。