裝飾器模式,動態地給乙個物件新增一些額外的職責,就增加功能來說,裝飾器模式比生成子類更為靈活。
**示例
#coding:utf-8
#裝飾器模式
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.name
class coke(beverage):
def __init__(self):
self.name = "coke"
self.price = 4.0
class milk(beverage):
def __init__(self):
self.name = "milk"
self.price = 5.0
class drinkdecorator():
def getname(self):
pass
def getprice(self):
pass
class 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.4
class 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.8
if __name__ == "__main__":
milk1 = milk()
print(milk1.getprice(),milk1.getname())
icemilk = icedecorator(milk1)
print(icemilk.getprice(),icemilk.getname())
cofe1 = coke()
print(cofe1.getprice(),cofe1.getname())
sugarcofe = sugardecorator(cofe1)
print(sugarcofe.getprice(),sugarcofe.getname())
該例子基於的需求:客戶點飲料系統,在使用者下單的過程中,可以對飲料進行相應的定製。
1、先定義了beverage類,所有的飲料都是由該類繼承而來;
2、定義drinkdecorator類,所有需要新增的功能都是由該類繼承而來;
3、定義了icedecorator類,對所點的飲料進行加冰,並且加冰後**也需要增加;定義了sugardecorator類,對所點的飲料進行加糖,並且加糖後**也需要增加。
4、在客戶端呼叫時,先生成milk1例項,然後在對milk1加冰的過程中,在icedecorator初始化的時候就將milk1例項傳入,在呼叫getname和getprice時,呼叫milk1例項的方法後,接著處理milk1方法返回的結果,從而達到動態的更改getname和getprice方法。
需要擴充套件、增強或者減弱乙個類的功能。
優點
1、裝飾器模式時繼承方式的乙個替代方案,可以輕量級的擴充套件被裝飾物件的功能;
2、python的裝飾器模式是實現aop的一種方式,便於相同操作位於不同呼叫為止的統一管理。
缺點
1、多層裝飾器的除錯和維護較困難。
python裝飾器模式的通用**
def drugprice(func):
print(self,args,kwargs)
self.price += 2
return func(self,*args,**kwargs)
class food():
def __init__(self):
self.price = 1
@drugprice
def getprice(self):
return self.price
if __name__ == "__main__":
f = food()
print(f.getprice())
python 中的裝飾器編寫過程:先定義裝飾器函式
def drugprice(func):
print(self,args,kwargs)
self.price += 2
return func(self,*args,**kwargs)
@drugprice@drugprice會被python解析為getprice=drugprice(getprice),此時可以理解為如下的執行順序def getprice(self):
return self.price
def getprice(self):
return self.price
getprice=drugprice(getprice)
然後呼叫getprice()函式就會把裝飾器裡面的內容執行完成。
Python設計模式 裝飾器模式
基於3.5.2,如下 coding utf 8 裝飾器模式 class beverage name price 0.0 type beverage defgetprice self return self.price defsetprice self,price self.price price d...
python設計模式 裝飾器模式
裝飾類方法 裝飾類物件方法 裝飾類functools 方法 類內建的裝飾器 python基礎 裝飾器高階 這篇部落格是學習各個方面的裝飾器,諸如裝飾方法 類 類方法 裝飾器庫functools 裝飾函式的裝飾器,就是為某個函式的執行前後,或者函式引數,進而對被裝飾的函式產生影響作用 def meth...
python裝飾器設計方法 裝飾器設計模式
本篇文章幫大家學習裝飾器設計模式,包含了裝飾器設計模式使用方法 操作技巧 例項演示和注意事項,有一定的學習價值,大家可以用來參考。裝飾器模式允許使用者在不改變其結構的情況下向現有物件新增新功能。這種型別的設計模式屬於結構模式,因為此模式充當現有類的包裝。這個模式建立了乙個裝飾器類,它封裝了原始類,並...