zoukankan      html  css  js  c++  java
  • python 设计模式之装饰器模式 Decorator Pattern

    #写在前面

    已经有一个礼拜多没写博客了,因为沉醉在了《妙味》这部小说里,里面讲的是一个厨师苏秒的故事。现实中大部分人不会有她的天分。我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人过。我还喜欢里面那些描写味道的文字,这会让我认真对待一日三餐。我还喜欢里面的一种态度,做事的时候要认真专注。我是个很容易急躁的人,特别是当做自己不太喜欢又不得不做的事的时候。但是很神奇,伺候花草的时候,我会一下子陶醉其中,我对花草有种痴迷的喜爱。等生活无忧的时候我会去种花,种蘑菇,像苏秒一样陶醉在自己热爱的事情里。我最喜欢的就是里面苏秒和回味的感情了,她独立,她专注于自己的事情,她有自己的世界,她不患得患失,她活在当下,她也会考虑不太远的将来。心之所向,身之所往。看完了我感觉我会让自己向自己喜欢的那种生活方式再靠拢一些。

    啰嗦完了开始写今天的博客设计模式之装饰器模式

    设计模式是一种类层次或者结构的的设计方式,是一种解决问题的思维方式,没有固定的公式

    装饰器模式比较好理解

     #引入理解装饰器

    小摊上卖手抓饼,烧饼,火烧一类的都选择性加 生菜,火腿,牛肉片,鸡蛋等

    老板做好的一个饼热气腾腾的,不能直接拿给顾客,要问顾客的喜好,加不加其他的东西,顾客说加牛肉片,这时候旁边的老板娘在饼上加牛肉片,然后装入袋子中,然后收钱。

    这里面刚刚做好的热气腾腾的烧饼或者手抓饼就是具体的构件,

    加 生菜,火腿,牛肉片,鸡蛋等 放入包装袋 这就是装饰器。

    #定义

    抽象构件

    具体构件

    抽象装饰类

    具体装饰类

    #角色

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

    #装饰器模式的优点

    1.装饰器类和被装饰器的类是独立的,你不需要懂我,我也不需要懂你,降低耦合度

    2.装饰模式是继承模式的一个替代方案

    #装饰器的缺点

     1.会产生很多小对象

    #装饰器的使用场景

    1.想给一个类增加功能,但是又不想修改原来的代码,可以

    2.类的核心功能不变,只是需要添加新的功能时候

    #举个例子

    #小摊上卖手抓饼和火烧,手抓饼5块一个,火烧6块一个,可以加辣椒酱,生菜,鸡蛋,牛肉片,火腿片
    #辣椒酱免费,生菜多加1元,鸡蛋多加2元,牛肉片多加5元,火腿片多加4元
    #顾客根据自己需要进行组合选择
    
    class Bing:
        name=''
        price=0.0
        
        def getPrice(self):
            return self.price
        def setPrice(self,price):
            self.price=price
        def getName(self):
            return self.name
    
    class HandHeldCake(Bing):
        def __init__(self):
            self.name='手抓饼'
            self.price=5
    
    class HuoShao(Bing):
        def __init__(self):
            self.name='火烧'
            self.price=6   
    
    class decorator:
        def getName(self):
            pass
        def getPrice(self):
            pass
    
    class spicyDecorator(decorator):
        def __init__(self,decorator):
            self.decorator=decorator
        def getName(self):
            return '+spicy'
        def getPrice(self):
            return 0
        
    class vegatableDecorator(decorator):
        def __init__(self,decorator):
            self.decorator=decorator
        def getName(self):
            return '+生菜'
        def getPrice(self):
            return 1
        
    class eggDecorator(decorator):
        def __init__(self,decorator):
            self.decorator=decorator
        def getName(self):
            return '+鸡蛋'
        def getPrice(self):
            return 2
    
        
    class beefDecorator(decorator):
        def __init__(self,decorator):
            self.decorator=decorator
        def getName(self):
            return '+牛肉片'
        def getPrice(self):
            return 5
        
    class peikonDecorator(decorator):
        def __init__(self,decorator):
            self.decorator=decorator
        def getName(self):
            return '+火腿片'
        def getPrice(self):
            return 4
        
    
    if __name__=='__main__':
        hs=HuoShao()
        szb=HandHeldCake()
        print(hs.getName(),hs.getPrice())
        egg=eggDecorator(hs)
        print(hs.getName(),egg.getName(),hs.getPrice()+egg.getPrice())
        beef=beefDecorator(egg)
        print(hs.getName(),egg.getName(),beef.getName(),hs.getPrice()+egg.getPrice()+beef.getPrice())
    

    其他的想要啥自己加就可以了

    参考

    https://www.cnblogs.com/noteless/p/9603041.html

    http://www.imooc.com/article/258816

     还参考了其他博客,忘记添加链接了

  • 相关阅读:
    [NOI2014]动物园
    [NOI2014]起床困难综合症
    bzoj2688 Green Hackenbush
    luogu P2575 高手过招
    [NOI2015]荷马史诗
    win10系统U盘读取不了怎么解决 三种方法快速解决"文件或目录损坏且无法读取& 发布时间:2020-06-05 09:19:46 作者:佚名 我要评论
    在 Linux 中,最直观、最可见的部分就是 文件系统(file system)
    GB 18030-2000《信息技术信息交换用汉字编码字符集基本集的扩充
    docker 分层 隔离
    DNS和BIND
  • 原文地址:https://www.cnblogs.com/baxianhua/p/11344097.html
Copyright © 2011-2022 走看看