gpt4 book ai didi

c# - 使用多个装饰器为对象添加功能?

转载 作者:太空狗 更新时间:2023-10-29 20:57:24 25 4
gpt4 key购买 nike

我正在尝试理解装饰器模式,并从示例中了解装饰器对象如何用于在运行时通过覆盖装饰对象的方法来扩展现有功能,以及它们如何通过新方法实现添加附加功能。

我有点困惑的是在哪里使用了多个装饰器以及如何访问扩展功能。通常在查看装饰器模式的示例时会显示如下内容:

IBusinessObject businessObject = new MailDecorator(
new SmsDecorator(
new FaxDecorator(
new BusinessObject()
)
)
);

想法是获取一个对象并动态添加邮件、短信和传真功能。现在如果你想发送邮件,这是 MailDecorator 类提供的方法,你可以这样做:

If(businessObject is MailDecorator)
{
((MailDecorator) businessObject).SendMail();
}

但是,如果您想发送 SMS 或传真,这是行不通的,因为在装饰器模式的正常实现中,您将无法访问装饰器引用的对象。

这是装饰器模式的局限性,还是超出了您期望使用此模式实现的范围,还是我完全误解了这里的某些内容?
不同的模式会更合适吗?

标准定义

“Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to sub-classing for extending functionality”

暗示这应该可以通过这种模式实现,但在一个对象上使用多个装饰器时似乎会崩溃。

最佳答案

这是对装饰者模式的一个常见误解。您可以使用装饰器模式做的是扩展功能,而不是API

这是什么意思?
这意味着,您可以向 API 提供的方法添加新功能,在您的情况下为 IBusinessObject .假设您的界面有一个方法 XmlDocument Export()BusinessObject 中实现并返回 BusinessObject 中的数据XmlDocument 中的实例实例。
现在,您可以创建一个 LoggingDecorator , 它实现了 Export像这样的方法:

public XmlDocument Export()
{
_logger.Log("Exporting...");
var result = _decoratedObject.Export();
_logger.Log("Done exporting...");
return result;
}

或者您可以创建一个 BusinessObjectSigningExportDecorator签署返回的 XmlDocument使用 xml-dsig 算法:

public XmlDocument Export()
{
var result = _decoratedObject.Export();
return SignXmlDocument(result);
}

然后您可以像这样一起使用它们:

IBusinessObject businessObject = new LoggingDecorator(
new BusinessObjectSigningExportDecorator(
new BusinessObject()
)
);

var xmlDocument = businessObject.Export();

调用Export现在将写入日志消息并签署 xml 导出。但您仍然可以使用 BusinessObject没有装饰器或只有一个装饰器。

使用装饰器模式的原因是能够透明地添加功能。如您所见,businessObject 的用户IBusinessObject 类型的变量不知道也不需要知道实际使用的类型。无论有没有装饰器,它都可以工作。

进一步思考:当您有一个返回 IBusinessObject 的工厂时因此,您可以扩展功能,而无需更改使用它们的代码,而无需更改类的实现 IBusinessObject .您只需要创建另一个装饰器并将其“附加”在工厂内,因此,您正在进行更改,该更改仅发生在代码的有限区域。因此,如果此更改破坏了任何内容,您就会确切地知道是什么代码导致了破坏。

此外,这强制了关注点分离,因为您的普通业务对象实现不知道也不关心应该使用哪种签名算法,或者需要完全使用哪种签名算法。

关于c# - 使用多个装饰器为对象添加功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5551029/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com