装饰器模式(功能)有很多好处:
当一个方法具有许多正交的关注点时,这将非常有用…也就是说,这些关注点均不相关,除了我们每次调用我们的方法时都希望全部(或部分)关注它们。这是装饰器模式真正有用的地方。
通过实现装饰器模式,我们订阅了开闭主体。我们的方法对将来的扩展开放,但对将来的修改不开放。遵循开放-封闭原则有很多有趣的好处。
但是,我发现的所有示例都非常复杂(例如,编写带有许多中间件的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)
}
}
这是一个更完整的例子
问题内容: 是否可以为Go中的任意函数创建一个包装程序,该包装程序将使用相同的参数并返回相同的值? 我不是在说看起来完全一样的包装器,看起来可能有所不同,但是应该可以解决问题。 例如,问题可能是创建一个任意函数的包装,该包装首先在缓存中查找函数调用的结果,并且仅在缓存未命中的情况下执行包装的函数。 问题答案: 答案基于@ joshlf13的想法和答案,但对我来说似乎更简单。 http://play
问题内容: 我希望仅当登录用户具有所需的权限级别时,其他功能才可执行。 为了使我的生活更加复杂,我想使用装饰器。下面,我尝试在“装饰”功能上设置属性-如下所示。 但是当我这样做时: 我得到一个错误 我想念什么? 问题答案: 您正在检查内部(包装)函数上的属性,但在原始(包装)函数上进行了设置。但是,您 根本 需要包装函数: 你的装饰需要返回 的东西 那将取代原有的功能。原始函数本身(添加了属性)可
问题 你想通过反省或者重写类定义的某部分来修改它的行为,但是你又不希望使用继承或元类的方式。 解决方案 这种情况可能是类装饰器最好的使用场景了。例如,下面是一个重写了特殊方法 __getattribute__ 的类装饰器, 可以打印日志: def log_getattribute(cls): # Get the original implementation orig_getatt
Django为视图提供了数个装饰器,用以支持相关的HTTP服务。 允许的HTTP 方法 django.views.decorators.http 包里的装饰器可以基于请求的方法来限制对视图的访问。若条件不满足会返回 django.http.HttpResponseNotAllowed。 require_http_methods(request_method_list)[source] 限制视图只能
装饰器(Decorators)(被babel支持, 在 03/17 之后作为stage-2的proposal被引入) 如果你在使用类似于mobx的库, 你能够使用装饰器装饰你的函数. 装饰器本质上其实就是将组件传入一个函数. 使用装饰器能让组件更灵活,更可读并且更易修改组件的功能. 不使用装饰器的例子 class ProfileContainer extends Component { //
上一篇文章将通过解决一个需求问题来了解了闭包,本文也将一样,通过慢慢演变一个需求,一步一步来了解 Python 装饰器。 首先有这么一个输出员工打卡信息的函数: def punch(): print('昵称:两点水 部门:做鸭事业部 上班打卡成功') punch() 输出的结果如下: 昵称:两点水 部门:做鸭事业部 上班打卡成功 然后,产品反馈,不行啊,怎么上班打卡没有具体的日