python-裝飾器模式

來源:互聯網
上載者:User

標籤:構建   建立   python   init   component   說明   效能   bsp   image   

說明:

有時為了給某個對象而不是給整個類添加一個功能,使用繼承機制是添加功能的一個有效途徑,但是不夠靈活,使用者不能控制對組件加邊框的方式和時機,並且會導致子類膨脹。一種較為靈活的方式就是將組件嵌入另一個對象中,這個嵌入的對象叫做裝飾。

裝飾模式:動態地給一個對象增加一些額外的職責。就擴充功能而言,裝飾模式提供了一種比使用子類更加靈活的替代方案。以對客戶透明的方式動態地給一個對象附加上更多的責任 可以在不需要建立更多子類的情況下,讓對象的功能得以擴充

裝飾模式分析

可以在不改變一個對象本身功能的基礎上給對象增加額外的新行為 是一種用於替代繼承的技術,它通過一種無須定義子類的方式給對象動態增加職責,使用對象之間的關聯關係取代類之間的繼承關係 引入了裝飾類,在裝飾類中既可以調用待裝飾的原有類的方法,還可以增加新的方法,以擴充原有類的功能

 

裝飾模式的結構

裝飾模式包含以下4個角色: Component(抽象構件) ConcreteComponent(具體構件) Decorator(抽象裝飾類) ConcreteDecorator(具體裝飾類)

執行個體:
#又提到了那個快餐點餐系統,不過今天我們只以其中的一個類作為主角:飲料類。首先,回憶下飲料類:class Beverage():    name = ""    price = 0.0    type = "BEVERAGE"    def getPrice(self):        return self.price    def setPrice(self, price):        self.price = price    def getName(self):        return self.nameclass coke(Beverage):    def __init__(self):        self.name = "coke"        self.price = 4.0class milk(Beverage):    def __init__(self):        self.name = "milk"        self.price = 5.0#除了基本配置,快餐店賣可樂時,可以選擇加冰,如果加冰的話,要在原價上加0.3元;# 賣牛奶時,可以選擇加糖,如果加糖的話,要原價上加0.5元。怎麼解決這樣的問題?# 可以選擇裝飾器模式來解決這一類的問題。首先,定義裝飾器類:class drinkDecorator():    def getName(self):        pass    def getPrice(self):        passclass iceDecorator(drinkDecorator):    def __init__(self, beverage):        self.beverage = beverage    def getName(self):        return self.beverage.getName() + " +ice"    def getPrice(self):        return self.beverage.getPrice() + 0.3class sugarDecorator(drinkDecorator):    def __init__(self, beverage):        self.beverage = beverage    def getName(self):        return self.beverage.getName() + " +sugar"    def getPrice(self):        return self.beverage.getPrice() + 0.5#構建好裝飾器後,在具體的業務情境中,就可以與飲料類進行關聯。以可樂+冰為例,樣本業務情境如下:if  __name__=="__main__":    coke_cola=coke()    print("Name:%s"%coke_cola.getName())    print("Price:%s"%coke_cola.getPrice())    ice_coke=iceDecorator(coke_cola)    print("Name:%s" % ice_coke.getName())    print("Price:%s" % ice_coke.getPrice())

 列印結果:

Name:coke
Price:4.0
Name:coke +ice
Price:4.3

模式優點

對於擴充一個對象的功能,裝飾模式比繼承更加靈活,不會導致類的個數急劇增加 可以通過一種動態方式來擴充一個對象的功能,通過設定檔可以在運行時選擇不同的具體裝飾類,從而實現不同的行為 可以對一個對象進行多次裝飾 具體構件類與具體裝飾類可以獨立變化,使用者可以根據需要增加新的具體構件類和具體裝飾類,且原有類庫代碼無須改變,符合開閉原則

模式缺點

使用裝飾模式進行系統設計時將產生很多小對象,大量小對象的產生勢必會佔用更多的系統資源,在一定程度上影響程式的效能 比繼承更加易於出錯,排錯也更困難,對於多次裝飾的對象,調試時尋找錯誤可能需要逐級排查,較為煩瑣

模式適用環境

在不影響其他對象的情況下,以動態、透明的方式給單個對象添加職責 當不能採用繼承的方式對系統進行擴充或者採用繼承不利於系統擴充和維護時可以使用裝飾模式  

python-裝飾器模式

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.