Python設計模式 裝飾器模式

2021-08-03 02:30:46 字數 3577 閱讀 7704

**基於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

defgetprice

(self):

return self.price

@drugprice會被python解析為getprice=drugprice(getprice),此時可以理解為如下的執行順序

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裝飾器設計方法 裝飾器設計模式

本篇文章幫大家學習裝飾器設計模式,包含了裝飾器設計模式使用方法 操作技巧 例項演示和注意事項,有一定的學習價值,大家可以用來參考。裝飾器模式允許使用者在不改變其結構的情況下向現有物件新增新功能。這種型別的設計模式屬於結構模式,因為此模式充當現有類的包裝。這個模式建立了乙個裝飾器類,它封裝了原始類,並...