本篇文章幫大家學習裝飾器設計模式,包含了裝飾器設計模式使用方法、操作技巧、例項演示和注意事項,有一定的學習價值,大家可以用來參考。
裝飾器模式允許使用者在不改變其結構的情況下向現有物件新增新功能。 這種型別的設計模式屬於結構模式,因為此模式充當現有類的包裝。
這個模式建立了乙個裝飾器類,它封裝了原始類,並提供了額外的功能,保持了類方法簽名的完整性。
裝飾者模式的動機是動態地附加物件的額外職責(功能)。
如何實現裝飾設計模式?
下面提到的**是如何在python中實現裝飾器設計模式的簡單演示。 該示例涉及以類形式展示咖啡店(coffeeshop類)。 建立的 coffee 類是乙個抽象類,這意味著它不能被例項化。
import six
from abc import abcmeta
@six.add_metaclass(abcmeta)
class abstract_coffee(object):
def get_cost(self):
pass
def get_ingredients(self):
pass
def get_tax(self):
return 0.1*self.get_cost()
class concrete_coffee(abstract_coffee):
def get_cost(self):
return 1.00
def get_ingredients(self):
return 'coffee'
@six.add_metaclass(abcmeta)
class abstract_coffee_decorator(abstract_coffee):
def __init__(self,decorated_coffee):
self.decorated_coffee = decorated_coffee
def get_cost(self):
return self.decorated_coffee.get_cost()
def get_ingredients(self):
return self.decorated_coffee.get_ingredients()
class sugar(abstract_coffee_decorator):
def __init__(self,decorated_coffee):
abstract_coffee_decorator.__init__(self,decorated_coffee)
def get_cost(self):
return self.decorated_coffee.get_cost()
def get_ingredients(self):
return self.decorated_coffee.get_ingredients() + ', sugar'
class milk(abstract_coffee_decorator):
def __init__(self,decorated_coffee):
abstract_coffee_decorator.__init__(self,decorated_coffee)
def get_cost(self):
return self.decorated_coffee.get_cost() + 0.25
def get_ingredients(self):
return self.decorated_coffee.get_ingredients() + ', milk'
class vanilla(abstract_coffee_decorator):
def __init__(self,decorated_coffee):
abstract_coffee_decorator.__init__(self,decorated_coffee)
def get_cost(self):
return self.decorated_coffee.get_cost() + 0.75
def get_ingredients(self):
return self.decorated_coffee.get_ingredients() + ', vanilla'
如下所述,coffeeshop抽象類的實現是通過乙個單獨的檔案完成的 -
import coffeeshop
mycoffee = coffeeshop.concrete_coffee()
print('ingredients: '+mycoffee.get_ingredients()+
'; cost: '+str(mycoffee.get_cost())+'; sales tax = '+str(mycoffee.get_tax()))
mycoffee = coffeeshop.milk(mycoffee)
print('ingredients: '+mycoffee.get_ingredients()+
'; cost: '+str(mycoffee.get_cost())+'; sales tax = '+str(mycoffee.get_tax()))
mycoffee = coffeeshop.vanilla(mycoffee)
print('ingredients: '+mycoffee.get_ingredients()+
'; cost: '+str(mycoffee.get_cost())+'; sales tax = '+str(mycoffee.get_tax()))
mycoffee = coffeeshop.sugar(mycoffee)
print('ingredients: '+mycoffee.get_ingredients()+
'; cost: '+str(mycoffee.get_cost())+'; sales tax = '+str(mycoffee.get_tax()))
執行上述程式生成以下輸出 -
python裝飾器 裝飾器
由於函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。def now print 2015 3 25 f now f 2015 3 25 函式物件有乙個 name 屬性,可以拿到函式的名字 now.name now f.name now 現在,假設我們要增強now 函式的...
python裝飾器 Python 裝飾器
簡言之,python裝飾器就是用於拓展原來函式功能的一種函式,這個函式的特殊之處在於它的返回值也是乙個函式,使用python裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。一般而言,我們要想拓展原來函式 最直接的辦法就是侵入 裡面修改,例如 這是我們最原始的的乙個函式,然後我們試圖記錄...
python裝飾器 函式裝飾器,類裝飾器
只要實現此 模式,這個obj就叫乙個裝飾器 參考 函式裝飾器 例子 def decorator func def inner args,kwargs print before.res func args,kwargs print after.return res return inner decor...