万物之中, 希望至美.

设计模式之装饰器模式

2018.10.17

当我们想对一个已有的对象添加额外的功能时,可以使用如下方法:

  1. 如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法)。
  2. 使用组合
  3. 使用继承

与继承相比,通常应该优先选择组合,因为继承使得代码更难复用,继承关系是静态的,并且应用于整个类以及这个类的所有实例。

设计模式为我们提供了第四种可选的方法,以支持动态的扩展一个对象的功能,这种方法就是装饰器。

装饰器有很多用途,比如数据校验,事务处理,缓存,日志等。

这里以装饰器实现斐波那契数列缓存为例:

import functools


def memoize(fn):
    known = {}

    @functools.wraps(fn)
    def decorator(args):
        if args not in known:
            known[args] = fn(args)
        return known[args]

    return decorator


@memoize
def fibonacci(n):
    '''返回斐波那契数列的第n个数'''
    assert (n >= 0), 'n must be >= 0'
    return n if n in (0, 1) else fibonacci(n - 1) + fibonacci(n - 2)
comments powered by Disqus