允許向乙個現有的物件新增新的功能,同時又不改變其結構。這種型別的設計模式屬於結構型模式,它是作為現有的類的乙個包裝。
這種模式建立了乙個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。
我們通過下面的例項來演示裝飾器模式的用法。其中,我們將把乙個形狀裝飾上不同的顏色,同時又不改變形狀類。
裝飾器模式.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的關係。實際應用中裝飾類可以同時裝飾幾個具體類。可以...
結構型模式 裝飾模式
裝飾模式是對類的組合進行的擴充。比如現在有個門,現在有一些額外功能,比如 新增鎖 貼春聯 門眼 門框全包 等功能,這些功能可以單獨存在,也可以兩兩組合等隨意組合。怎麼實現這樣的 門 呢.繼承 比如有 貼春聯 門眼 就新增乙個新類,這樣如果需要其他的功能就需要無窮多的子類。組合 加強版組合 裝飾模式 ...