7 裝飾器模式

2021-09-29 11:19:33 字數 2832 閱讀 5422

裝飾器模式定義如下:動態地給乙個物件新增一些額外的職責。在增加功能方面,裝飾器模式比生成子類更為靈活。修飾器(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 ...