結構型模式(三) 裝飾器模式

2021-10-17 04:24:28 字數 3389 閱讀 1661

允許向乙個現有的物件新增新的功能,同時又不改變其結構。這種型別的設計模式屬於結構型模式,它是作為現有的類的乙個包裝。

這種模式建立了乙個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。

我們通過下面的例項來演示裝飾器模式的用法。其中,我們將把乙個形狀裝飾上不同的顏色,同時又不改變形狀類。

裝飾器模式.jpg

在原型別基礎上擴充套件

class

clsa

:def

__init__

(self):

super()

.__init__()

self

.count =

0print

('i\'m a count:%d'

%self

.count)

class

clsa_decorated_after

:def

__init__

(self

, a:clsa):

super()

.__init__()

self

.a = a

self

.a.count+=1

@property

defcount

(self):

return

self

.a.count

class

clsa_decorated_after2

:def

__init__

(self

, a:clsa_decorated_after):

super()

.__init__()

self

.a = a

self

.a.a.count+=1

@property

defcount

(self):

return

self

.a.a.count

if __name__ ==

'__main__'

: a =

clsa()

b =clsa_decorated_after

(clsa()

) c =

clsa_decorated_after2

(clsa_decorated_after

(clsa()

))print

(a.count, b.count, c.count)

模組化裝飾器

import abc

class

idecorator

(metaclass=abc.abcmeta)

: @abc.abstractmethod

defreset

(self)

:pass

@abc.abstractproperty

defcount

(self)

:return

'get count'

@abc.abstractmethod

@count.setter

defcount

(self, count)

:return

'set count'

class

clsa

(idecorator)

:def

__init__

(self)

:super()

.__init__(

) self._count =

0print

('建立了%s'

%self.__class__.__name__)

defreset

(self)

:print

(self.count)

@property

defcount

(self)

:return self._count

@count.setter

defcount

(self, count)

: self._count = count

class

clsa_d1

(idecorator)

:def

__init__

(self, a:idecorator)

: self.a = a

print

('建立了%s'

%self.__class__.__name__)

defreset

(self)

: self.count+=

10 self.a.reset(

) @property

defcount

(self)

:return self.a.count

@count.setter

defcount

(self, count)

: self.a.count = count

class

clsa_d2

(idecorator)

:def

__init__

(self, a:idecorator)

: self.a = a

print

('建立了%s'

%self.__class__.__name__)

defreset

(self)

: self.a.count+=

4 self.a.reset(

) @property

defcount

(self)

:return self.a.count

@count.setter

defcount

(self, count)

: self.a.count = count

if __name__ ==

'__main__'

: a = clsa(

) a.reset(

) b = clsa_d1(clsa())

b.reset(

) c = clsa_d2(clsa_d1(clsa())

) c.reset(

) d = clsa_d2(clsa())

d.reset(

)

——可以直接點這裡可以看到全部資料內容免費打包領取。

結構型模式 裝飾器模式

為已有的物件新增新的功能 新增新的方法到物件所屬的類中 使用組合創造新的物件 使用繼承創造子類 組合 繼承 新增新方法 python中我們可以使用內建的裝飾器特性來實現對類,方法的擴充套件,而無需使用繼承。用裝飾器來實現程式中的橫切關注點 應用中通用的部件,可以在程式中被廣泛使用的 推薦使用func...

裝飾模式(結構型模式)

裝飾模式是一種動態的給類中新增新行為的設計模式,裝飾模式比生成子類更為靈活,可以給某個物件而不是整個類新增一些功能。值得注意的是裝飾模式的裝飾類也繼承介面類,同時他也有介面類的指標指向他需要裝飾的具體類。外表看著像is a的關係,實際也是has a的關係。實際應用中裝飾類可以同時裝飾幾個具體類。可以...

結構型模式 裝飾模式

裝飾模式是對類的組合進行的擴充。比如現在有個門,現在有一些額外功能,比如 新增鎖 貼春聯 門眼 門框全包 等功能,這些功能可以單獨存在,也可以兩兩組合等隨意組合。怎麼實現這樣的 門 呢.繼承 比如有 貼春聯 門眼 就新增乙個新類,這樣如果需要其他的功能就需要無窮多的子類。組合 加強版組合 裝飾模式 ...