裝飾器模式定義如下:動態地給乙個物件新增一些額外的職責。在增加功能方面,裝飾器模式比生成子類更為靈活。修飾器(decorator
)模式能夠以透明的方式(不會影響其他物件)動態地將功能新增到乙個物件中。
從實現的角度來說,python
修飾器是乙個可呼叫物件(函式、方法、類),接受乙個函式物件fin
作為輸入,並返回另乙個函式物件fout
。這意味著可以將任何具有這些屬性的可呼叫物件當作乙個修飾器。
修飾器模式和python修飾器之間並不是一對一的等價關係。python修飾器能做的實際上比修飾器模式多得多,其中之一就是實現修飾器模式。下面看乙個快餐店買飲料的示例:
class
beverage
(object):
name =
"" price =
0.0type
="beverage"
defget_price
(self)
:return self.price
defset_price
(self, price)
: self.price = price
defget_name
(self)
:return self.name
class
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
(object):
defget_name
(self)
:pass
defget_price
(self)
:pass
class
icedecorator
(drinkdecorator)
:def
__init__
(self, beverage)
: self.beverage = beverage
defget_name
(self)
:return self.beverage.get_name()+
" +ice"
defget_price
(self)
:return self.beverage.get_price()+
0.3class
sugardecorator
(drinkdecorator)
:def
__init__
(self, beverage)
: self.beverage = beverage
defget_name
(self)
:return self.beverage.get_name()+
" +sugar"
defget_price
(self)
:return self.beverage.get_price()+
0.5
構建好裝飾器後,在具體的業務場景中,就可以與飲料類進行關聯。以可樂+冰為例,示例業務場景如下:
if __name__ ==
"__main__"
: coke_cola = coke(
)print
("name:%s"
% coke_cola.get_name())
print
("price:%s"
% coke_cola.get_price())
ice_coke = icedecorator(coke_cola)
print
("name:%s"
% ice_coke.get_name())
print
("price:%s"
% ice_coke.get_price(
))
列印結果:
name:coke
price:
4.0name:coke +ice
price:
4.3
裝飾器模式和上一節說到的**模式非常相似,可以認為,裝飾器模式就是**模式的乙個特殊應用,兩者的共同點是都具有相同的介面,不同點是**模式側重對主題類的過程的控制,而裝飾模式則側重對類功能的加強或減弱。
二、裝飾器模式的優點和應用場景
優點:
1、裝飾器模式是繼承方式的乙個替代方案,可以輕量級的擴充套件被裝飾物件的功能;
2、python的裝飾器模式是實現aop的一種方式,便於相同操作位於不同呼叫位置的統一管理。
應用場景:
1、需要擴充套件、增強或者減弱乙個類的功能,如本例。
三、裝飾器模式的缺點
1、多層裝飾器的除錯和維護有比較大的困難。
Java設計模式7 裝飾器模式
裝飾器模式 就是對已經存在的某些類進行裝飾,以此來擴充套件一些功能。component 抽象構件角色 真實物件和裝飾物件有相同的介面。這樣,客戶端物件就能夠以與真實物件相同的方式同裝飾物件互動。concretecomponent 具體構件角色 真實物件,實現component介面。decorator...
(7)裝飾模式
又叫作包裝模式。通過一種對客戶端透明的方式來擴充套件物件的功能,是繼承關係的乙個替換方案。裝飾模式就是把要新增的附加功能分別放在單獨的類中,並讓這個類包含它要裝飾的物件,當需要執行時,客戶端就可以有選擇地 按順序地使用裝飾功能包裝物件。適用於動態的給乙個物件新增一些額外的職責。增加功能來說,此模式比...
設計模式7 裝飾模式
給乙個物件增加一些新的功能,而且是動態的,要求裝飾物件和被裝飾物件實現同乙個介面,裝飾物件持有被裝飾物件的例項 裝飾介面sourceable public inte ce sourceable 被裝飾類source public class source implements sourceable ...