Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 这是装饰图案吗?_Design Patterns - Fatal编程技术网

Design patterns 这是装饰图案吗?

Design patterns 这是装饰图案吗?,design-patterns,Design Patterns,我正在使用内置的系统类在.NET中发送电子邮件。它位于System.Mail命名空间或类似的名称空间中 我需要为这个类添加一个接口,这样我就可以将它交换出来进行测试或其他实现 为此,我只需定义一个类来包装这个内置类 这是装饰图案的一个例子吗?我只是有点困惑,因为decorator模式的描述通常说明它是用来添加功能的,我不会添加任何功能。不,这不是decorator模式,而是代理模式,注意:我认为Microsoft希望您让您的测试类继承自SmtpClient类,并实现Send,AsynchSend

我正在使用内置的系统类在.NET中发送电子邮件。它位于System.Mail命名空间或类似的名称空间中

我需要为这个类添加一个接口,这样我就可以将它交换出来进行测试或其他实现

为此,我只需定义一个类来包装这个内置类


这是装饰图案的一个例子吗?我只是有点困惑,因为decorator模式的描述通常说明它是用来添加功能的,我不会添加任何功能。

不,这不是decorator模式,而是代理模式,注意:我认为Microsoft希望您让您的测试类继承自SmtpClient类,并实现Send,AsynchSend等您自己(如果您想插入测试版本,他们只需写入文本文件或其他文件)。然而,如果你想用正确的方式,而不是微软的方式,那就按照马克说的方式去做。在.NET中,你会发现越来越多的接口在它们应该存在的时候不存在的例子。

嗯,这听起来就像封装(包装类)和抽象(接口)

但是,一旦有了接口,就可以使用decorator模式

严格地说,在装饰器使用中,每一层都有相同的界面;装饰本质上是一个由不同具体类组成的菊花链,这些类(在实现接口时)要么将方法传递到链中的下一个链接,要么执行定制的操作

更新:我并不是说你应该这样做-这只是一个示例,说明了在原始电子邮件问题的上下文中,decorator模式可能是如何工作的)

例如,您可能有一个接口
IEmail
,一个基本实现
BasicEmail
(使用内置的.NET代码),一个
loggingeemail
,它接受
IEmail
,只传递信息(但在运行时记录信息),以及一个
转发电子邮件
,它接受
电子邮件
,并将
更改为
等(可能用于开发/测试/直播目的)

那么你可以:

`ForwardingEmail` => `LoggingEmail` => `BasicEmail` => (regular .NET classes)
(其中前三个仅称为
IEmail


这允许您在不更改API的情况下扩展功能。在工厂/IoC设置中非常常见,在AOP中更是如此。

虽然我认为你没有像我一样清楚地回答了确切的问题,但我给了你一个答案,因为我懒得解释应该如何做。如果说,只要实现这个接口,你的TestMailSender类就可以在任何需要ISendMail的地方插入,这不是更好吗?我很想知道为什么。。。?有什么反馈吗?你应该很幸运-我会用+1来平衡你们两个的实绩answers@annakata-有趣的是,我对投票并不在意(反正我是在我的每日上限,所以+1只会恢复我失去的2分;-p)-我只想听听[anon]不同意的是什么。。。哦,好吧,我可能永远也不知道。至于信息,我不是想说怎么做;我只是在原始问题的上下文中解释装饰者模式。