Design patterns 这是装饰图案吗?
我正在使用内置的系统类在.NET中发送电子邮件。它位于System.Mail命名空间或类似的名称空间中 我需要为这个类添加一个接口,这样我就可以将它交换出来进行测试或其他实现 为此,我只需定义一个类来包装这个内置类Design patterns 这是装饰图案吗?,design-patterns,Design Patterns,我正在使用内置的系统类在.NET中发送电子邮件。它位于System.Mail命名空间或类似的名称空间中 我需要为这个类添加一个接口,这样我就可以将它交换出来进行测试或其他实现 为此,我只需定义一个类来包装这个内置类 这是装饰图案的一个例子吗?我只是有点困惑,因为decorator模式的描述通常说明它是用来添加功能的,我不会添加任何功能。不,这不是decorator模式,而是代理模式,注意:我认为Microsoft希望您让您的测试类继承自SmtpClient类,并实现Send,AsynchSend
这是装饰图案的一个例子吗?我只是有点困惑,因为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]不同意的是什么。。。哦,好吧,我可能永远也不知道。至于信息,我不是想说怎么做;我只是在原始问题的上下文中解释装饰者模式。