首页 / C# / c# – 装饰模式,通过继承或依赖注入?
c# – 装饰模式,通过继承或依赖注入?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 装饰模式,通过继承或依赖注入?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2826字,纯文字阅读大概需要5分钟。
内容图文
![c# – 装饰模式,通过继承或依赖注入?](/upload/InfoBanner/zyjiaocheng/822/a2f288c6d5f64cd2b87aa0a97a610b9d.jpg)
现在我正在研究常见的设计模式,并且在很大程度上我理解了装饰模式的目的.但我没有得到的是,在装饰器类中包装现有对象的目的是什么?
考虑这种情况,因为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;
}
}
这两个类完成相同的事情,除了我发现第一个版本更好,因为它允许我使用基础构造函数来设置进度更新的委托.基类已经支持覆盖该方法,那么我需要包装对象是什么?
这两个类都是装饰器模式的例子吗?我宁愿使用第一个选项,但我很少以这种方式看到例子.
解决方法:
想象一下,你有n个不同的IProgress实现< T>接口.
为了这个例子,让我们考虑两个实现:
> EndpointProgress< T>,每当响应不同时,这将轮询端点和报告.
> QueryProgress< T>,这将定期执行数据库查询,并在每次结果不同时报告.
为了使用您的第一种方法限制这两种实现,您必须创建两个ProgressThrottle< T>实现,一个继承自EndpointProgress< T>,另一个继承自QueryProgress< T>.
为了使用第二种方法来限制这两种实现,你只需要使用EndpointProgress< T>的包装实例.和QueryProgress< T>.
var throttledEndpointProgress = new ProgressThrottle2<int>(new EndpointProgress<T>());
var throttledQueryProgress = new ProgressThrottle2<int>(new QueryProgress<T>());
编辑:
So in a scenario were I am certain I will not extend a class more than once to add functionality, is it acceptable to not use a wrapper?
我仍然会使用装饰器的第二个实现(我甚至不确定第一个实现将被视为装饰器模式)有几个原因:
> S.O.L.I.D.原则’open/closed principle指出:
Software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification.
我必须修改您当前的Progress实现以扩展它,您违反了Open / Closed.
>让ProgressThrottle从Progress继承意味着每次Progress’构造函数更改时,ProgressThrottle也需要更改其构造函数.
>通过使用包装器装饰器,您可以组合和组合装饰器.让我们考虑IProgress< T>的实现.记录每个onReport调用.您可以 – 基于配置,环境等 – 以不同的方式组合这些装饰器以实现不同的目标:
var progress1 = new LoggingProgress<int>(
new ProgressThrottle<int>(new Progress<int>())
);
var progress2 = new ProgressThrottle<int>(
new LoggingProgress<int>(new Progress<int>())
);
在这里,progress1将仅记录受限制的报告进度. progress2将记录所有报告的进度,但将以受限制的方式进行报告.根据您的目标,您可能需要一个实现或另一个实现;或者你可能想要它们,一个用于临时诊断,另一个用于prod,但最重要的是你不必改变装饰器的实现来改变这种行为.
内容总结
以上是互联网集市为您收集整理的c# – 装饰模式,通过继承或依赖注入?全部内容,希望文章能够帮你解决c# – 装饰模式,通过继承或依赖注入?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。