设计模式-结构型模式之装饰器

实现AOP(面向切面编程)的一种便捷方式,额外扩展统一管理

装饰器的实现我在语言进阶篇中有提到,这里不再赘述

 1 from decorator import decorator
 2 
 3 
 4 @decorator
 5 def pre_execute(func, param=None, *args, **kwargs):
 6     if param == "g":
 7         print(">>生活如夏日流水般缓缓前进,我们不要焦急")
 8         return func(*args, **kwargs)
 9     elif param == "c":
10         print(">>只有永不遏止的奋斗,才能使青春之花即便是凋谢,也是壮丽地凋谢")
11         return func(*args, **kwargs)
12 
13 
14 @pre_execute(param="g")
15 def execute():
16     print(">>作者:三毛")
17 
18 
19 @pre_execute(param="c")
20 def execute_():
21     print(">>作者:路遥")
22 
23 
24 if __name__ == '__main__':
25     execute()
26     execute_()

 当时写这个的时候,没有多想,今天回过头来,我就在想,装饰器模式和装饰器到底是不是一回事?百度一番,也没找到中肯的答案,有的:装饰器是装饰器模式一种宽泛的定义,有的:装饰器是装饰器模式的实现,也不知道哪个对

在看完piglei的书后,书中第八章明确给出了答案,装饰器和装饰器模式是没有任何关系的,前者是装饰函数的,后者是装饰类的,后面我会把装饰器模式的应用例子把书中内容回忆一遍

 1 """
 2 装饰器模式
 3 """
 4 
 5 
 6 class Number:
 7     def __init__(self, numbers):
 8         self.numbers = numbers
 9 
10     def get(self):
11         return self.numbers
12 
13 
14 class EvenOnlyNumber:
15     """
16     过滤偶数
17     """
18 
19     def __init__(self, decorator):
20         self.decoratored = decorator
21 
22     def get(self):
23         return [number for number in self.decoratored.get() if number % 2 == 0]
24 
25 
26 class LtNumber:
27     """
28     大于某个值
29     """
30 
31     def __init__(self, decorator, min_val):
32         self.decoratored = decorator
33         self.min_val = min_val
34 
35     def get(self):
36         return [number for number in self.decoratored.get() if number > self.min_val]
37 
38 
39 if __name__ == '__main__':
40     n_obj = Number([42, 5, 68, 2, 9])
41     even_obj = EvenOnlyNumber(n_obj)
42     final_res = LtNumber(even_obj, 30).get()
43     print(final_res)

上面是实现装饰器模式的案例,我理解的是,最前面的类对象是为后面的类服务的

 

热门相关:斗神战帝   仗剑高歌   天启预报   霸皇纪   刺客之王