我正在使用内置系统类在.NET中发送电子邮件。它位于System.Mail命名空间或类似的东西中。
我需要为这个类添加一个接口,以便我可以将其交换出来进行测试或其他实现。
为此,我只定义一个包装这个内置类的类?
这是装饰模式的一个例子吗?我只是有点困惑,因为装饰器模式的描述通常表明它用于添加功能,我不会添加任何功能。
答案 0 :(得分:3)
嗯,这听起来就像封装(包装类)和抽象(接口)。
但是,一旦拥有界面,您就可以然后使用装饰器模式。
严格地说,在装饰器使用中,每个层都有相同的接口;装饰本质上是一个由不同具体类组成的菊花链(在实现界面时)要么将方法传递给链中的 next 链接,要么做一些定制的事情。
(更新:我不是说你应该这样做 - 这只是装饰模式如何工作的一个例子,在原始电子邮件问题)
例如,您可能有一个接口IEmail
,一个基本实现BasicEmail
(使用内置的.NET代码),LoggingEmail
接受IEmail
,只是传递事物(但记录你去的东西),和ForwardingEmail
接受IEmail
并更改To
等(可能用于dev / test / live目的)
然后你可以:
`ForwardingEmail` => `LoggingEmail` => `BasicEmail` => (regular .NET classes)
(前三个仅称为IEmail
)
这使您可以在不更改API的情况下扩展功能。在工厂/ IoC设置中非常常见,AOP更是如此。
答案 1 :(得分:2)
不,这不是装饰模式,它是代理模式,注意:我认为微软希望你让你的测试类继承自SmtpClient类,并自己实现Send,AsynchSend等(以他们的方式)只需写入文本文件或其他任何内容 - 如果您想插入测试版本)。但是,如果您想要以正确的方式,而不是微软的方式,请按照Marc所说的方式进行。您将在.NET中找到越来越多的示例,这些示例在它们应该存在时不存在。