大话设计模式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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。