• 大话设计模式Python实现-装饰模式


    装饰模式(Decorator Pattern):动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活.

    下面是一个给人穿衣服的过程,使用装饰模式:

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 
     4 __author__ = 'Andy'
     5 
     6 """
     7 大话设计模式
     8 设计模式——装饰模式
     9 装饰模式(Decorator Pattern):动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活.
    10 特点: 有效的把类的核心职责和装饰功能区分开,而且可以去除相关类中重复的装饰逻辑
    11 """
    12 
    13 # 定义对象接口
    14 class Person(object):
    15 
    16     def __init__(self,name):
    17         self.name = name
    18 
    19     def show(self):
    20         print "装扮的%s"%self.name
    21 
    22 #装饰类
    23 class Finery(Person):
    24 
    25     def __init__(self):
    26         pass
    27 
    28     def Decorate(self,componet):
    29         self.componet = componet
    30 
    31     def show(self):
    32         if self.componet != None:
    33             self.componet.show()
    34 
    35 #装扮——T恤
    36 class TShirts(Finery):
    37 
    38     def __init__(self):
    39         pass
    40 
    41     def show(self):
    42         print 'T恤'
    43         self.componet.show()
    44 
    45 #装扮——大裤衩
    46 class BigTrouser(Finery):
    47 
    48     def __init__(self):
    49         pass
    50 
    51     def show(self):
    52         print '大裤衩'
    53         self.componet.show()
    54 
    55 # 装扮——人字拖
    56 class FlipFlops(Finery):
    57 
    58     def __init__(self):
    59         pass
    60 
    61     def show(self):
    62         print '人字拖'
    63         self.componet.show()
    64 
    65 if __name__ == '__main__':
    66     p = Person('Andy')
    67     ff = FlipFlops()
    68     bt = BigTrouser()
    69     ts = TShirts()
    70     ff.Decorate(p)
    71     bt.Decorate(ff)
    72     ts.Decorate(bt)
    73     ts.show()

    这几个类的设计如下图:

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


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

  • 相关阅读:
    $router和$route的区别
    提莫攻击
    paste命令
    数组中的第K个最大元素
    od命令
    被围绕的区域
    不用虚机不用Docker使用Azure应用服务部署ASP.NET Core程序
    面试官:对象可能会迟到,但它永远不会缺席
    Kubernetes 的层级命名空间介绍
    每日一道 LeetCode (21):对称二叉树
  • 原文地址:https://www.cnblogs.com/onepiece-andy/p/python-decorator-pattern.html
Copyright © 2020-2023  润新知