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获取任意xml节点值的方法
May 05 Python
python实现下载整个ftp目录的方法
Jan 17 Python
python的构建工具setup.py的方法使用示例
Oct 23 Python
Python登录并获取CSDN博客所有文章列表代码实例
Dec 28 Python
python将文本中的空格替换为换行的方法
Mar 19 Python
利用nohup来开启python文件的方法
Jan 14 Python
pandas DataFrame 行列索引及值的获取的方法
Jul 02 Python
Django Form and ModelForm的区别与使用
Dec 06 Python
Python pip配置国内源的方法
Feb 14 Python
Pyspark读取parquet数据过程解析
Mar 27 Python
python和php学习哪个更有发展
Jun 17 Python
python基础之while循环语句的使用
Apr 20 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查看请求头信息获取远程图片大小的方法分享
2013/12/25 PHP
详解WordPress开发中的get_post与get_posts函数使用
2016/01/04 PHP
PHP简单操作MongoDB的方法(安装及增删改查)
2016/05/26 PHP
PHP有序表查找之二分查找(折半查找)算法示例
2018/02/09 PHP
Yii框架日志记录Logging操作示例
2018/07/12 PHP
详解Laravel5.6 Passport实现Api接口认证
2018/07/27 PHP
utf8的编码算法 转载
2006/12/27 Javascript
js中查找最近的共有祖先元素的实现代码
2010/12/30 Javascript
详细介绍jQuery.outerWidth() 函数具体用法
2015/07/20 Javascript
javascript发送短信验证码实现代码
2015/11/12 Javascript
jQuery事件委托之Safari
2016/07/05 Javascript
浅谈JS读取DOM对象(标签)的自定义属性
2016/11/21 Javascript
详解浏览器渲染页面过程
2017/02/09 Javascript
微信小程序  TLS 版本必须大于等于1.2问题解决
2017/02/22 Javascript
JS中的数组转变成JSON格式字符串的方法
2017/05/09 Javascript
Angular4实现动态添加删除表单输入框功能
2017/08/11 Javascript
解决vue中无法动态修改jqgrid组件 url地址的问题
2018/03/01 Javascript
jQuery实现表单动态添加与删除数据操作示例
2018/07/03 jQuery
跨平台python异步回调机制实现和使用方法
2013/11/26 Python
django自定义Field实现一个字段存储以逗号分隔的字符串
2014/04/27 Python
在Django的模型中添加自定义方法的示例
2015/07/21 Python
python中numpy基础学习及进行数组和矢量计算
2017/02/12 Python
Python获取本机所有网卡ip,掩码和广播地址实例代码
2018/01/22 Python
Python实现针对给定字符串寻找最长非重复子串的方法
2018/04/21 Python
Python入门Anaconda和Pycharm的安装和配置详解
2019/07/16 Python
树莓派使用python-librtmp实现rtmp推流h264的方法
2019/07/22 Python
python操作openpyxl导出Excel 设置单元格格式及合并处理代码实例
2019/08/27 Python
PyCharm 2020.1版安装破解注册码永久激活(激活到2089年)
2020/09/24 Python
如何使用python自带IDLE的几种方法
2020/10/10 Python
体育教育专业毕业生自荐信
2013/11/15 职场文书
个人承诺书
2014/03/26 职场文书
《三顾茅庐》教学反思
2014/04/10 职场文书
弘扬焦裕禄精神走群众路线思想汇报
2014/09/12 职场文书
难以忽视的真相观后感
2015/06/05 职场文书
2015中学学校工作总结
2015/07/20 职场文书
会计专业自荐信范文
2019/05/22 职场文书