装饰器模式(功能)有很多好处:
当一个方法具有许多正交的关注点时,这将非常有用…也就是说,这些关注点均不相关,除了我们每次调用我们的方法时都希望全部(或部分)关注它们。这是装饰器模式真正有用的地方。 通过实现装饰器模式,我们订阅了开闭主体。我们的方法对将来的扩展开放,但对将来的修改不开放。遵循开放-封闭原则有很多有趣的好处。
当一个方法具有许多正交的关注点时,这将非常有用…也就是说,这些关注点均不相关,除了我们每次调用我们的方法时都希望全部(或部分)关注它们。这是装饰器模式真正有用的地方。
通过实现装饰器模式,我们订阅了开闭主体。我们的方法对将来的扩展开放,但对将来的修改不开放。遵循开放-封闭原则有很多有趣的好处。
但是,我发现的所有示例都非常复杂(例如,编写带有许多中间件的HTTP服务器)。这使我很难在其他地方应用该原则。我需要可以轻松尝试的东西,以便将我的头缠住它。
有人可以给我一个更简单的示例,它可以最好地说明如何在Go中执行装饰器模式(功能)吗?
Alex Alehano的这个示例太简单了,无法投入实际使用。我需要一些可以说明这一点的东西:
func Decorate(c Decorated, ds ...Decorator) Decorated { decorated := c for _, decorate := range ds { decorated = decorate(decorated) } return decorated }
根据不同的选项/指令(例如,从上到下,到base64等)进行字符串操作将是IMO的最佳示例,并且还要添加前缀/后缀,因为“ 如果装饰器本身已参数化,则此技术特别有用 ”。
首先,装饰器基本上是一个函数,该函数将特定类型的另一个函数作为其参数,并返回相同类型的函数。这实际上使您可以创建功能链。所以在Go中看起来像这样:
// this is the type of functions you want to decorate type StringManipulator func(string) string // this is your decorator. func ToLower(m StringManipulator) StringManipulator { return func(s string) string { lower := strings.ToLower(s) return m(lower) } }
这是一个更完整的例子