大话设计模式Python实现-装饰模式

装饰模式(Decorator Pattern):动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活.

下面是一个给人穿衣服的过程,使用装饰模式:

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 __author__ = 'Andy'
 5 
 6 """
 7 大话设计模式
 8 设计模式——装饰模式
 9 装饰模式(Decorator Pattern):动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活.
10 特点: 有效的把类的核心职责和装饰功能区分开,而且可以去除相关类中重复的装饰逻辑
11 """
12 
13 # 定义对象接口
14 class Person(object):
15 
16     def __init__(self,name):
17         self.name = name
18 
19     def show(self):
20         print "装扮的%s"%self.name
21 
22 #装饰类
23 class Finery(Person):
24 
25     def __init__(self):
26         pass
27 
28     def Decorate(self,componet):
29         self.componet = componet
30 
31     def show(self):
32         if self.componet != None:
33             self.componet.show()
34 
35 #装扮——T恤
36 class TShirts(Finery):
37 
38     def __init__(self):
39         pass
40 
41     def show(self):
42         print 'T恤'
43         self.componet.show()
44 
45 #装扮——大裤衩
46 class BigTrouser(Finery):
47 
48     def __init__(self):
49         pass
50 
51     def show(self):
52         print '大裤衩'
53         self.componet.show()
54 
55 # 装扮——人字拖
56 class FlipFlops(Finery):
57 
58     def __init__(self):
59         pass
60 
61     def show(self):
62         print '人字拖'
63         self.componet.show()
64 
65 if __name__ == '__main__':
66     p = Person('Andy')
67     ff = FlipFlops()
68     bt = BigTrouser()
69     ts = TShirts()
70     ff.Decorate(p)
71     bt.Decorate(ff)
72     ts.Decorate(bt)
73     ts.show()

这几个类的设计如下图:

 通过一个个继承自装饰类Finery的对象,实现给Person类赋予职责的功能,Person类并不会感知Finery的存在


作者:Andy
出处:http://www.cnblogs.com/onepiece-andy/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文地址:https://www.cnblogs.com/onepiece-andy/p/python-decorator-pattern.html