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 打印对象的所有属性值的方法
Sep 11 Python
python对配置文件.ini进行增删改查操作的方法示例
Jul 28 Python
Python scikit-learn 做线性回归的示例代码
Nov 01 Python
python中使用zip函数出现错误的原因
Sep 28 Python
python利用selenium进行浏览器爬虫
Apr 25 Python
twilio python自动拨打电话,播放自定义mp3音频的方法
Aug 08 Python
python装饰器相当于函数的调用方式
Dec 27 Python
Django实现内容缓存实例方法
Jun 30 Python
Python使用grequests并发发送请求的示例
Nov 05 Python
python3.8.3安装教程及环境配置的详细教程(64-bit)
Nov 28 Python
分析Python感知线程状态的解决方案之Event与信号量
Jun 16 Python
Python 数据可视化神器Pyecharts绘制图像练习
Feb 28 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
重置版战役片段
2020/04/09 魔兽争霸
PHP的伪随机数与真随机数详解
2015/05/27 PHP
php PDO判断连接是否可用的实现方法
2017/04/03 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
JavaScript是否可实现多线程  深入理解JavaScript定时机制
2009/12/22 Javascript
JSON.parse 解析字符串出错的解决方法
2010/07/08 Javascript
jquery实现带二级菜单的导航示例
2014/04/28 Javascript
Javascript中的五种数据类型详解
2014/12/26 Javascript
JavaScript实现标题栏文字轮播效果代码
2015/10/24 Javascript
JS实现iframe自适应高度的方法(兼容IE与FireFox)
2016/06/24 Javascript
ES6学习之变量的解构赋值
2017/02/12 Javascript
关于jQuery EasyUI 中刷新Tab选项卡后一个页面变形的解决方法
2017/03/02 Javascript
Vuex模块化实现待办事项的状态管理
2017/03/15 Javascript
js匿名函数使用&传参(实例)
2017/09/08 Javascript
AngualrJs清除定时器遇到的坑
2017/10/13 Javascript
vue计算属性及使用详解
2018/04/02 Javascript
jQuery+PHP实现上传裁剪图片
2020/06/29 jQuery
JS为什么说async/await是generator的语法糖详解
2019/07/11 Javascript
微信小程序sessionid不一致问题解决
2019/08/30 Javascript
Vue 自定义标签的src属性不能使用相对路径的解决
2019/09/17 Javascript
在vue中根据光标的显示与消失实现下拉列表
2019/09/29 Javascript
[53:13]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-GAMING
2014/05/22 DOTA
[02:17]DOTA2亚洲邀请赛 RAVE战队出场宣传片
2015/02/07 DOTA
Python numpy实现数组合并实例(vstack,hstack)
2018/01/09 Python
对python numpy数组中冒号的使用方法详解
2018/04/17 Python
pandas进行数据的交集与并集方式的数据合并方法
2018/06/27 Python
对Django 转发和重定向的实例详解
2019/08/06 Python
python 使用三引号时容易犯的小错误
2020/10/21 Python
基于zepto的插件之移动端无缝向上滚动并上下触摸滑动实例代码
2016/12/20 HTML / CSS
米兰必去买手店排行榜首位:Antonioli
2016/09/11 全球购物
Easy Spirit官网:美国休闲鞋履中的代表品牌
2019/04/12 全球购物
建筑设计专业求职自我评价
2014/03/02 职场文书
电子商务专业应届毕业生求职信
2014/06/21 职场文书
市场营销计划书范文
2015/01/16 职场文书
2015年化妆品销售工作总结
2015/05/11 职场文书
索尼ICF-5900W收音机测评
2022/04/24 无线电