中间件是Decorator模式的实现吗?

时间:2018-02-08 23:45:52

标签: django design-patterns middleware

在Django中,有中间件的想法。它包括更改请求并将其传递给下一个中间件等等,并与响应相反。

中间件是否实现了Decorator的设计模式?它们是装饰者的特例吗?它们之间有什么区别?

另外,Django中Decorator的实现和它的GoF描述有什么区别?

2 个答案:

答案 0 :(得分:2)

中间件本身不是装饰器,但是可以使用Django中的几个 documentation 从中间件中制作装饰器:

def decorator_from_middleware(middleware_class):
"""
Given a middleware class (not an instance), return a view decorator. This
lets you use middleware functionality on a per-view basis. The middleware
is created with no params passed.
"""
    return make_middleware_decorator(middleware_class)()

def decorator_from_middleware_with_args(middleware_class):
"""
Like decorator_from_middleware, but return a function
that accepts the arguments to be passed to the middleware_class.
Use like::

     cache_page = decorator_from_middleware_with_args(CacheMiddleware)
     # ...

     @cache_page(3600)
     def my_view(request):
         # ...
"""
    return make_middleware_decorator(middleware_class)

答案 1 :(得分:2)

中间件和装饰器相似,可以完成相同的工作。它们提供了一种在链/堆栈下游的其他效果之前或之后插入中间效果的方法。

区别在于中间件流水线是通过使用简化来计算的,该简化为中间件提供了一个更简单的接口,该接口隐藏了链中的下一个中间件对象。而是提供了一个IHandler.handle函数,该函数使用正确的接口(例如w)将消息应用于该对象。

另一个区别是,动态添加/删除中间件比较容易,因为它位于容器对象的中间(例如,在数组中),并且可以按需组装管道。装饰器是一堆俄罗斯玩偶,不能轻易地重新摆弄它。

相关问题