现在我正在研究常见的设计模式,并且在很大程度上我理解了装饰模式的目的.但我没有得到的是,在装饰器类中包装现有对象的目的是什么?
考虑这种情况,因为Progress是观察者模式的一部分,我想限制其订阅者的更新量以防止UI线程锁定.
所以我把类修饰为每50毫秒只更新一次.
public class ProgressThrottle<T> : Progress<T>
{
private DateTime _time = DateTime.Now;
public ProgressThrottle(Action<T> handler) : base(handler)
{
}
protected override void OnReport(T value)
{
if (DateTime.Now.AddMilliseconds(50) < _time)
{
base.OnReport(value);
_time = DateTime.Now;
}
}
}
public class ProgressThrottle2<T> : IProgress<T>
{
private DateTime _time = DateTime.Now;
private readonly IProgress<T> _wrapper;
public ProgressThrottle2(IProgress<T> wrapper)
{
_wrapper = wrapper;
}
public void Report(T value)
{
if (DateTime.Now.AddMilliseconds(50) < _time)
{
_wrapper.Report(value);
_time = DateTime.Now;
}
}
Run Code Online (Sandbox Code Playgroud)
这两个类完成相同的事情,除了我发现第一个版本更好,因为它允许我使用基础构造函数来设置进度更新的委托.基类已经支持覆盖该方法,那么我需要包装对象是什么?
这两个类都是装饰器模式的例子吗?我宁愿使用第一个选项,但我很少以这种方式看到例子.