【问题标题】:Extension Methods - Decorator Pattern扩展方法 - 装饰器模式
【发布时间】:2013-02-19 02:54:31
【问题描述】:

我想知道我们是否可以将扩展方法视为 C# 中装饰器模式的实现?因为目标相同,但实施的逻辑和概念可能不同?

谢谢!

【问题讨论】:

  • 它们与装饰器模式有什么相似之处?扩展方法只是调用静态方法的语法糖。静态方法是“普通的旧功能”。装饰器是当您让一个对象通过包装/委托其方法或添加新方法来扩展另一种类型对象的行为时。
  • 我认为这对于初学者来说是一个非常好的/有效的问题。我不确定为什么投反对票..
  • 我想你错过了一些了解。当您查看 Intelisense 时,当然扩展方法会“装饰”一种类型。但是,看看像StreamReader 这样的好的装饰器实现。您注意到这是来自 Stream 的派生类,并且真正装饰了 Stream 的功能......
  • @CSharper 嗯? StreamReader 不是从 Stream 派生的。这也不是让它成为装饰者的东西。完全相反的事实。当您想要扩展基类的新实例的行为时,您可以使用派生类。当你想改变一个特定的、已经存在的装饰类实例的行为时,你可以使用装饰器。 (如果说得通,我不知道如何正确表达。)
  • @CSharper 或者,借用维基百科:子类化在编译时改变行为,在运行时修饰改变行为。

标签: c# design-patterns decorator


【解决方案1】:

装饰器模式通常与独立于其他实例的类型的特定实例添加行为相关联。在扩展方法的情况下,它会影响在同一范围内编译的类型的所有实例。我认为它不是装饰器模式的一部分。

【讨论】:

    【解决方案2】:

    我认为您没有正确理解装饰器模式。
    这不是关于添加新方法。这是关于向现有方法添加新功能。

    所以,不,扩展方法不是装饰器模式的实现。

    【讨论】:

    • 我现在看到了,但是 .NET 中是否有装饰器的具体实现没有隐藏在我们曾经使用过的某些库中?
    • 我目前不知道有什么,但如果你正在寻找一个例子,你可以看看here。我在解释模式时使用了一个具体的。
    猜你喜欢
    • 2011-06-20
    • 2017-04-02
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 2011-11-22
    • 2017-05-25
    • 2018-09-21
    • 1970-01-01
    相关资源
    最近更新 更多