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里将list中元素依次向前移动一位
Sep 12 Python
python 文件操作api(文件操作函数)
Aug 28 Python
python flask 多对多表查询功能
Jun 25 Python
使用python实现tcp自动重连
Jul 02 Python
Python实现的端口扫描功能示例
Apr 08 Python
python 统计数组中元素出现次数并进行排序的实例
Jul 02 Python
python 划分数据集为训练集和测试集的方法
Dec 11 Python
Python Unittest根据不同测试环境跳过用例的方法
Dec 16 Python
python爬取Ajax动态加载网页过程解析
Sep 05 Python
django ORM之values和annotate使用详解
May 19 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
Nov 18 Python
python manim实现排序算法动画示例
Aug 14 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
全国FM电台频率大全 - 1 北京市
2020/03/11 无线电
PHP 执行系统外部命令 system() exec() passthru()
2009/08/11 PHP
php中json_decode()和json_encode()的使用方法
2012/06/04 PHP
慎用preg_replace危险的/e修饰符(一句话后门常用)
2013/06/19 PHP
详解PHP字符串替换str_replace()函数四种用法
2017/10/13 PHP
用jscript启动sqlserver
2007/06/21 Javascript
AJAX使用了UpdatePanel后无法使用alert弹出脚本
2010/04/02 Javascript
你必须知道的Javascript知识点之"字面量和对应类型"说明介绍
2013/04/23 Javascript
javascript计算星座属相(十二生肖属相)示例代码
2014/01/09 Javascript
javascript中函数作为参数调用的方法
2015/02/09 Javascript
javascript单页面手势滑屏切换原理详解
2016/03/21 Javascript
js实现多图左右切换功能
2016/08/04 Javascript
浅谈jQuery中hide和fadeOut的区别 show和fadeIn的区别
2016/08/18 Javascript
Ext JS 实现建议词模糊动态搜索功能
2017/05/13 Javascript
原生JS实现 MUI导航栏透明渐变效果
2017/11/07 Javascript
Vue表单类的父子组件数据传递示例
2018/05/03 Javascript
Vuejs开发环境搭建及热更新【推荐】
2018/09/07 Javascript
Vue中 v-if/v-show/插值表达式导致闪现的原因及解决办法
2018/10/12 Javascript
解决iview多表头动态更改列元素发生的错误的方法
2018/11/02 Javascript
如何基于javascript实现贪吃蛇游戏
2020/02/09 Javascript
基于javascript实现碰撞检测
2020/03/12 Javascript
基于 Vue 的 Electron 项目搭建过程图文详解
2020/07/22 Javascript
python实现按任意键继续执行程序
2016/12/30 Python
python 查找字符串是否存在实例详解
2017/01/20 Python
python selenium 弹出框处理的实现
2019/02/26 Python
python中的socket实现ftp客户端和服务器收发文件及md5加密文件
2020/04/01 Python
Python中的Cookie模块如何使用
2020/06/04 Python
matplotlib 范围选区(SpanSelector)的使用
2021/02/24 Python
Farfetch美国:奢侈品牌时尚购物平台
2019/05/02 全球购物
新闻编辑自荐信
2013/11/03 职场文书
美德好少年事迹材料
2014/01/19 职场文书
教育英语专业毕业生的求职信
2014/03/13 职场文书
2015年档案管理员工作总结
2015/05/13 职场文书
欠条格式范本
2015/07/03 职场文书
推广普通话的宣传语
2015/07/13 职场文书
解决Tkinter中button按钮未按却主动执行command函数的问题
2021/05/23 Python