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实现监控linux性能及进程消耗性能的方法
Jul 25 Python
以911新闻为例演示Python实现数据可视化的教程
Apr 23 Python
部署Python的框架下的web app的详细教程
Apr 30 Python
python3实现读取chrome浏览器cookie
Jun 19 Python
运动检测ViBe算法python实现代码
Jan 09 Python
Python实现抢购IPhone手机
Feb 07 Python
Go/Python/Erlang编程语言对比分析及示例代码
Apr 23 Python
windows下python安装小白入门教程
Sep 18 Python
浅谈Python小波分析库Pywavelets的一点使用心得
Jul 09 Python
基于Python实现剪切板实时监控方法解析
Sep 11 Python
Numpy(Pandas)删除全为零的列的方法
Sep 11 Python
Biblibili视频投稿接口分析并以Python实现自动投稿功能
Feb 05 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中使用addslashes函数报错问题的解决方法
2013/02/06 PHP
php实现购物车功能(上)
2020/07/23 PHP
php fseek函数读取大文件两种方法
2016/10/12 PHP
swoole和websocket简单聊天室开发
2017/11/18 PHP
实例讲解JS中数组Array的操作方法
2014/05/09 Javascript
JQuery中extend的用法实例分析
2015/02/08 Javascript
jQuery移动页面开发中的触摸事件与虚拟鼠标事件简介
2015/12/03 Javascript
理解jquery事件冒泡
2016/01/03 Javascript
javascript实现方法调用与方法触发小结
2016/03/26 Javascript
利用Angular+Angular-Ui实现分页(代码加简单)
2017/03/10 Javascript
基于ajax和jsonp的原生封装(实例)
2017/10/16 Javascript
浅谈Vue Element中Select下拉框选取值的问题
2018/03/01 Javascript
解决betterScroll在vue中存在图片时,出现拉不动的问题
2018/09/27 Javascript
js屏蔽退格键(backspace或者叫后退键与F5)
2019/02/10 Javascript
使用 Vue cli 3.0 构建自定义组件库的方法
2019/04/30 Javascript
小程序如何支持使用 async/await详解
2019/09/12 Javascript
Python进阶学习之特殊方法实例详析
2017/12/01 Python
python算法与数据结构之单链表的实现代码
2019/06/27 Python
python2和python3应该学哪个(python3.6与python3.7的选择)
2019/10/01 Python
使用python制作一个解压缩软件
2019/11/13 Python
Tensorflow分批量读取数据教程
2020/02/07 Python
Python如何测试stdout输出
2020/08/10 Python
Python如何在bool函数中取值
2020/09/21 Python
纯CSS实现右侧底部悬浮效果(悬浮QQ、微信、微博、邮箱等联系方式)
2015/04/24 HTML / CSS
HTML5画渐变背景图片并自动下载实现步骤
2013/11/18 HTML / CSS
UNOde50美国官网:西班牙珠宝品牌
2020/08/15 全球购物
违反学校规定检讨书
2014/01/18 职场文书
小学二年级学生评语
2014/04/21 职场文书
普通党员个人剖析材料
2014/10/08 职场文书
高中生毕业评语
2014/12/30 职场文书
民主评议教师党员自我评价
2015/03/04 职场文书
如何书写民事调解协议书?
2019/06/25 职场文书
2019最新婚庆对联集锦!
2019/07/10 职场文书
微信小程序结合ThinkPHP5授权登陆后获取手机号
2021/11/23 PHP
以MySQL5.7为例了解一下执行计划
2022/04/13 MySQL
vue生命周期钩子函数以及触发时机
2022/04/26 Vue.js