python

超轻量级php框架startmvc

Python设计模式之装饰模式实例详解

更新时间:2020-06-21 19:18:01 作者:startmvc
本文实例讲述了Python设计模式之装饰模式。分享给大家供大家参考,具体如下:装饰模式(De

本文实例讲述了Python设计模式之装饰模式。分享给大家供大家参考,具体如下:

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

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


#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'Andy'
"""
大话设计模式
设计模式——装饰模式
装饰模式(Decorator Pattern):动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活.
特点: 有效的把类的核心职责和装饰功能区分开,而且可以去除相关类中重复的装饰逻辑
"""
# 定义对象接口
class Person(object):
 def __init__(self,name):
 self.name = name
 def show(self):
 print "装扮的%s"%self.name
#装饰类
class Finery(Person):
 def __init__(self):
 pass
 def Decorate(self,componet):
 self.componet = componet
 def show(self):
 if self.componet != None:
 self.componet.show()
#装扮——T恤
class TShirts(Finery):
 def __init__(self):
 pass
 def show(self):
 print 'T恤'
 self.componet.show()
#装扮——大裤衩
class BigTrouser(Finery):
 def __init__(self):
 pass
 def show(self):
 print '大裤衩'
 self.componet.show()
# 装扮——人字拖
class FlipFlops(Finery):
 def __init__(self):
 pass
 def show(self):
 print '人字拖'
 self.componet.show()
if __name__ == '__main__':
 p = Person('Andy')
 ff = FlipFlops()
 bt = BigTrouser()
 ts = TShirts()
 ff.Decorate(p)
 bt.Decorate(ff)
 ts.Decorate(bt)
 ts.show()

运行结果:

T恤 大裤衩 人字拖 装扮的Andy

这几个类的设计如下图:

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

Python 设计模式 装饰模式