这是装饰模式吗?

时间:2009-01-05 05:04:24

标签: design-patterns

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

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

为此,我只定义一个包装这个内置类的类?

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

2 个答案:

答案 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中找到越来越多的示例,这些示例在它们应该存在时不存在。