文档章节

python设计模式(三)--装饰器模式

极光火狐狸
 极光火狐狸
发布于 2016/05/12 14:19
字数 395
阅读 36
收藏 0

最近正在持续更新源码库,代码都是参考大话设计模式翻成python版,完整代码片段请到github上去下载.

https://github.com/zhengtong0898/python-patterns

 

参考:

    书籍<<大话设计模式>> 第六章

 

Python 3.x

# -.- coding:utf-8 -.-
# __author__ = 'zhengtong'
# 继承的方式面对变幻莫测的服装搭配, 立马凌乱无比.
# 其他模式的选型: 建造者模式
# 嗯,虽然建造者模式是内部组装完毕,但是建造者模式要求
# 建造的过程必须是稳定的,而服装搭配的过程是非固定的,所以。。
# 再选择其他的模式: 装饰器模式
# 装饰器模式,动态的给一个对象添加一些额外的职责,就增加功能来说
# 装饰器比生成子类更为灵活.

# 最终的效果是解决每个类都单独show()的过程.


from functools import wraps


def decorate(func, finery):

    @wraps(func)
    def wrap(*args, **kwargs):
        return '{0} {1}'.format(finery, func(*args, **kwargs))
    return wrap


def big_trouser(func):
    return decorate(func, "垮裤")


def tsherts(func):
    return decorate(func, "大T恤")


def sneaker(func):
    return decorate(func, "破球鞋")


def suit(func):
    return decorate(func, "西装")


def tie(func):
    return decorate(func, "领带")


def leather_shoes(func):

    return decorate(func, "皮鞋")


class Main:

    def __init__(self, name):
        self.name = name

    @big_trouser
    @tsherts
    def one(self):
        print('第一种装扮')
        return self.show()

    @leather_shoes
    @tie
    @suit
    def two(self):
        print('第二种装扮')
        return self.show()

    @sneaker
    @leather_shoes
    @big_trouser
    @tie
    def three(self):
        print('第三种装扮')
        return self.show()

    def show(self):
        return '装扮的{0}'.format(self.name)


if __name__ == '__main__':
    xc = Main('小菜')
    print(xc.one())
    print(xc.two())
    print(xc.three())

 

© 著作权归作者所有

共有 人打赏支持
极光火狐狸
粉丝 11
博文 29
码字总数 14739
作品 0
普陀
私信 提问
python 与设计模式 ——工厂与单例

python 与设计模式 源码地址:[http://git.oschina.net/duoduo3_69/python_design_pattern][1] git checkout v001(这个版本与此篇博客相符) zarkpy里面运用了很多设计模式,以前一直很费解p...

duoduo3_69
2013/11/27
0
0
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
2018/06/24
0
0
设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu
2017/11/02
0
0
PHP设计模式(一):简介及创建型模式

我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设...

juhenj
2014/05/15
228
2
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.1K
69

没有更多内容

加载失败,请刷新页面

加载更多

分布式之延时任务方案解析

方案分析 (1)数据库轮询 思路 该方案通常是在小型项目中使用,即通过一个线程定时的去扫描数据库,通过订单时间来判断是否有超时的订单,然后进行update或delete等操作 实现 博主当年早期是用...

微笑向暖wx
10分钟前
0
0
博客目录

1.剑指offer目录 剑指offer目录 2.开放的面试题 开放面试题目录

细节探索者
10分钟前
0
0
自定义线程池

自定义线程工厂: public class CustomThreadFactory implements ThreadFactory { private static final Logger LOGGER = LoggerFactory.getLogger(CustomThreadFactory.class); pu......

hensemlee
40分钟前
1
0
记一次oom内核优化记录:vm.lower_zone_protection

情景 最近gitlab服务会偶发性500,当前机器部署了gitlab、nfs等服务,经过排查发现是nfsd引发oom,导致系统运行不畅。处理过程如下: 事故现场 开发在使用gitlab的时候发现,偶发性的出现500...

阿dai
今天
4
0
Spring Batch JSON 支持

Spring Batch 4.1 开始能够支持 JSON 格式了。这个发布介绍了一个新的数据读(item reader)能够读取一个 JSON 资源,这个资源按照下面的格式: [  {    "isin": "123",    ...

honeymose
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部