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