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基础教程之序列详解
Aug 29 Python
python错误处理详解
Sep 28 Python
用Python实现斐波那契(Fibonacci)函数
Mar 25 Python
python学习之matplotlib绘制散点图实例
Dec 09 Python
Python 查找字符在字符串中的位置实例
May 02 Python
tensorflow实现加载mnist数据集
Sep 08 Python
Python WEB应用部署的实现方法
Jan 02 Python
使用Python轻松完成垃圾分类(基于图像识别)
Jul 09 Python
python中Lambda表达式详解
Nov 20 Python
Tensorflow中tf.ConfigProto()的用法详解
Feb 06 Python
对python中return与yield的区别详解
Mar 12 Python
Python使用内置函数setattr设置对象的属性值
Oct 16 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下保存远程图片到本地的办法
2010/08/08 PHP
第4章 数据处理-php正则表达式-郑阿奇(续)
2011/07/04 PHP
php模拟ping命令(php exec函数的使用方法)
2013/10/25 PHP
Codeigniter出现错误提示Error with CACHE directory的解决方案
2014/06/12 PHP
thinkPHP中分页用法实例分析
2015/12/26 PHP
PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例
2016/01/07 PHP
php使用CutyCapt实现网页截图保存的方法
2016/10/03 PHP
PHP基于新浪IP库获取IP详细地址的方法
2017/05/04 PHP
JavaScript Perfection kill 测试及答案
2010/03/23 Javascript
javascript处理a标签超链接默认事件的方法
2015/06/29 Javascript
jquery带下拉菜单和焦点图代码分享
2015/08/24 Javascript
JavaScript中的操作符类型转换示例总结
2016/05/30 Javascript
JavaScript中的对象继承关系
2016/08/01 Javascript
Jqprint实现页面打印
2017/01/06 Javascript
angular.js4使用 RxJS 处理多个 Http 请求
2017/09/23 Javascript
JavaScript实现图片懒加载的方法分析
2018/07/05 Javascript
Cocos2d实现刮刮卡效果
2018/12/20 Javascript
详解Webpack如何引入CDN链接来优化编译后的体积
2019/06/21 Javascript
js时间转换毫秒的实例代码
2019/08/21 Javascript
vue 获取url里参数的两种方法小结
2020/11/12 Javascript
vuex Module将 store 分割成模块的操作
2020/12/07 Vue.js
[45:25]完美世界DOTA2联赛循环赛 PXG vs IO 第一场 11.06
2020/11/09 DOTA
Python退火算法在高次方程的应用
2018/07/26 Python
Python多线程原理与用法详解
2018/08/20 Python
python实现单链表中删除倒数第K个节点的方法
2018/09/28 Python
python中设置超时跳过,超时退出的方式
2019/12/13 Python
python读取xml文件方法解析
2020/08/04 Python
HTML5 Canvas——用路径描画线条实例介绍
2013/06/09 HTML / CSS
英国电信商店:BT Shop
2019/12/17 全球购物
PHP面试题及答案二
2015/05/23 面试题
C语言编程练习
2012/04/02 面试题
电子商务网站的创业计划书
2014/01/05 职场文书
2014年大学庆元旦迎新年活动方案
2014/03/09 职场文书
刘胡兰观后感
2015/06/16 职场文书
八年级物理教学反思
2016/02/19 职场文书
详解Python+OpenCV进行基础的图像操作
2022/02/15 Python