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


Posted in Python onJanuary 21, 2019

本文实例讲述了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

这几个类的设计如下图:

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

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

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python完全新手教程
Feb 08 Python
详解Python中的多线程编程
Apr 09 Python
python插入数据到列表的方法
Apr 30 Python
Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
Sep 21 Python
matplotlib设置legend图例代码示例
Dec 19 Python
python 实现在Excel末尾增加新行
May 02 Python
Python2和Python3中urllib库中urlencode的使用注意事项
Nov 26 Python
浅谈Pandas:Series和DataFrame间的算术元素
Dec 22 Python
tensorflow 固定部分参数训练,只训练部分参数的实例
Jan 20 Python
python 获取当前目录下的文件目录和文件名实例代码详解
Mar 10 Python
简单了解django处理跨域请求最佳解决方案
Mar 25 Python
用基于python的appium爬取b站直播消费记录
Apr 17 Python
python利用Tesseract识别验证码的方法示例
Jan 21 #Python
对python过滤器和lambda函数的用法详解
Jan 21 #Python
利用Python正则表达式过滤敏感词的方法
Jan 21 #Python
Python 实现王者荣耀中的敏感词过滤示例
Jan 21 #Python
opencv python统计及绘制直方图的方法
Jan 21 #Python
python numpy 按行归一化的实例
Jan 21 #Python
python树莓派红外反射传感器
Jan 21 #Python
You might like
php中强制下载文件的代码(解决了IE下中文文件名乱码问题)
2011/05/09 PHP
淘宝ip地址查询类分享(利用淘宝ip库)
2014/01/07 PHP
浅谈php命令行用法
2015/02/04 PHP
php实现向javascript传递数组的方法
2015/07/27 PHP
PHP实现支持加盐的图片加密解密
2016/09/09 PHP
PHP基于socket实现的简单客户端和服务端通讯功能示例
2017/07/10 PHP
兼容IE/Firefox/Opera/Safari的检测页面装载完毕的脚本Ext.onReady的实现
2009/07/14 Javascript
javaScript call 函数的用法说明
2010/04/09 Javascript
JavaScript中用于四舍五入的Math.round()方法讲解
2015/06/15 Javascript
解决angular的$http.post()提交数据时后台接收不到参数值问题的方法
2015/12/10 Javascript
浅谈JS正则表达式的RegExp对象和括号的使用
2016/07/28 Javascript
JavaScript严格模式下关于this的几种指向详解
2017/07/12 Javascript
浅谈ECMAScript6新特性之let、const
2017/08/02 Javascript
vue 使用eventBus实现同级组件的通讯
2018/03/02 Javascript
vue-video-player 通过自定义按钮组件实现全屏切换效果【推荐】
2018/08/29 Javascript
将RGB值转换为灰度值的简单算法
2019/10/09 Javascript
微信小程序实现多图上传
2020/06/19 Javascript
[01:32]DOTA2次级联赛——首支职业女子战队选拔赛全记录
2014/10/23 DOTA
Python查找两个有序列表中位数的方法【基于归并算法】
2018/04/20 Python
Python网页正文转换语音文件的操作方法
2018/12/09 Python
Windows10+anacond+GPU+pytorch安装详细过程
2020/03/24 Python
详解python datetime模块
2020/08/17 Python
Django celery异步任务实现代码示例
2020/11/26 Python
CSS3实现渐变背景兼容问题
2020/05/06 HTML / CSS
英国领先的品牌珠宝和配件供应商:Acotis Jewellery
2018/03/07 全球购物
英国比较机场停车场网站:Airport Parking Essentials
2019/12/01 全球购物
经济实惠的名牌太阳镜和眼镜:Privé Revaux
2021/02/07 全球购物
表彰先进集体通报
2014/01/12 职场文书
歌唱比赛主持词
2014/03/18 职场文书
2014年母亲节演讲稿范文
2014/05/07 职场文书
教师求职信
2014/06/17 职场文书
关于运动会的广播稿
2015/08/19 职场文书
幼儿园大班教师评语
2019/06/21 职场文书
Nginx配置Https安全认证的实现
2021/05/26 Servers
Python max函数中key的用法及原理解析
2021/06/26 Python
海贼王十大潜力果实,路飞仅排第十,第一可毁世界(震震果实)
2022/03/18 日漫