装饰模式(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()

这几个类的设计如下图:

通过一个个继承自装饰类Finery的对象,实现给Person类赋予职责的功能,Person类并不会感知Finery的存在

作者:Andy
出处:http://www.cnblogs.com/onepiece-andy/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

最新文章

  1. sqlservcer行列互转
  2. ASP.Net MVC3 图片上传详解(form.js,bootstrap)
  3. shell脚本每天自动备份mysql数据库
  4. C#-WinForm-无边框窗体的移动和阴影-API
  5. Myeclipse2014 自带的报表功能 与 Eclipse BIRT
  6. MySQL Troubleshoting:Waiting on query cache mutex 腾讯数据库工程师:幕南风
  7. iOS App完整项目
  8. java下radomAccessFile文件写入读取
  9. Webapi帮助文档
  10. 一起学libcef--搭建自己的libcef运行环境(Win32程序,错误C2220解决方案)
  11. Java多线程之内存可见性
  12. FP数据库配置文件
  13. NOIP水题测试(2017082501)
  14. 从浏览器地址栏输入URL到浏览器呈现数据全过程解析
  15. Orcale分析函数OVER(PARTITION BY... ORDER BY...)的讲解
  16. ELK Stack 5.2.2 安装文档
  17. jquery appendTo用法
  18. VMWARE网络配置内网与外网互ping
  19. CodeForces 1065E. Side Transmutations 计数
  20. U盘 格式化 ext3 ext4

热门文章

  1. ASP.NET MVC 中枚举生成下拉框
  2. 安装Redis(Windows版)
  3. word转html预览
  4. 探究java对象头
  5. mssql附加的数据库查询的时候没有搜索权限
  6. git did not exit cleanly (exit code 1) 的解决办法
  7. crontab运行python不生效,但是手动执行正常的问题和解决方案
  8. Django的路由系统:URL
  9. static、const、extern等关键字
  10. kubernetes CRI 前世今生