一尘不染

Go中的装饰器功能

go

装饰器模式(功能)有很多好处

当一个方法具有许多正交的关注点时,这将非常有用…也就是说,这些关注点均不相关,除了我们每次调用我们的方法时都希望全部(或部分)关注它们。这是装饰器模式真正有用的地方。

通过实现装饰器模式,我们订阅了开闭主体。我们的方法对将来的扩展开放,但对将来的修改不开放。遵循开放-封闭原则有很多有趣的好处。

但是,我发现的所有示例都非常复杂(例如,编写带有许多中间件的HTTP服务器)。这使我很难在其他地方应用该原则。我需要可以轻松尝试的东西,以便将我的头缠住它。

有人可以给我一个更简单的示例,它可以最好地说明如何在Go中执行装饰器模式(功能)吗?

Alex
Alehano的这个示例
太简单了,无法投入实际使用。我需要一些可以说明这一点的东西:

func Decorate(c Decorated, ds ...Decorator) Decorated {
    decorated := c
    for _, decorate := range ds {
        decorated = decorate(decorated)
    }
    return decorated
}

根据不同的选项/指令(例如,从上到下,到base64等)进行字符串操作将是IMO的最佳示例,并且还要添加前缀/后缀,因为“
如果装饰器本身已参数化,则此技术特别有用
”。


阅读 187

收藏
2020-07-02

共1个答案

一尘不染

首先,装饰器基本上是一个函数,该函数将特定类型的另一个函数作为其参数,并返回相同类型的函数。这实际上使您可以创建功能链。所以在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)
    }
}

这是一个更完整的例子

2020-07-02