python 設計模式之裝飾器模式 Decorator Pattern

#寫在前面html

已經有一個禮拜多沒寫博客了,由於沉醉在了《妙味》這部小說裏,裏面講的是一個廚師蘇秒的故事。現實中大部分人不會有她的天分。我喜歡她的性格:老是想着去解決問題,好像歷來沒有怨天尤人過。我還喜歡裏面那些描寫味道的文字,這會讓我認真對待每日三餐。我還喜歡裏面的一種態度,作事的時候要認真專一。我是個很容易急躁的人,特別是當作本身不太喜歡又不得不作的事的時候。可是很神奇,伺候花草的時候,我會一會兒陶醉其中,我對花草有種癡迷的喜好。等生活無憂的時候我會去種花,種蘑菇,像蘇秒同樣陶醉在本身熱愛的事情裏。我最喜歡的就是裏面蘇秒和回味的感情了,她獨立,她專一於本身的事情,她有本身的世界,她不患得患失,她活在當下,她也會考慮不太遠的未來。心之所向,身之所往。看完了我感受我會讓本身向本身喜歡的那種生活方式再靠攏一些。python

 

囉嗦完了開始寫今天的博客設計模式之裝飾器模式設計模式

設計模式是一種類層次或者結構的的設計方式,是一種解決問題的思惟方式,沒有固定的公式less

裝飾器模式比較好理解設計

 

 #引入理解裝飾器

小攤上賣手抓餅,燒餅,火燒一類的都選擇性加 生菜,火腿,牛肉片,雞蛋等htm

老闆作好的一個餅熱氣騰騰的,不能直接拿給顧客,要問顧客的喜愛,加不加其餘的東西,顧客說加牛肉片,這時候旁邊的老闆娘在餅上加牛肉片,而後裝入袋子中,而後收錢。對象

這裏面剛剛作好的熱氣騰騰的燒餅或者手抓餅就是具體的構件,blog

加 生菜,火腿,牛肉片,雞蛋等 放入包裝袋 這就是裝飾器。繼承

 

#定義

抽象構件get

具體構件

抽象裝飾類

具體裝飾類

 

#角色

裝飾模式,動態地給一個對象添加一些額外的職責,就增長功能來講,裝飾模式比生成子類更爲靈活

#裝飾器模式的優勢

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

 還參考了其餘博客,忘記添加連接了

相關文章
相關標籤/搜索