裝飾器模式

2022-08-26 15:33:14 字數 2063 閱讀 4870

一、定義

裝飾器模式能夠動態地將向乙個現有物件新增功能而不改變其結構。裝飾者通過建立乙個與原類同型別的裝飾類包裝現有類,擴充套件了原類的功能。

二、例子

奶茶與調料,除了最基本的水以外,構成不同奶茶的元素就只有調料。

三、結構

**實現:

class drink(object):

m_name = none

m_cost = none

def getdescription(self):

return self.m_name

def cost(self):

return self.m_cost

class milktea(drink):

def __init__(self, name, cost):

self.m_name = name

self.m_cost = cost

class decorater(drink):

m_state = {}

def __init__(self, milktea):

self.m_milktea = milktea

def cost(self):

return self.m_cost + self.m_milktea.cost()

def getdescription(self):

return self.m_name + self.m_milktea.getdescription()

class bubble(decorater):

m_name = "奶蓋"

m_cost = 5

def setstate(self):

if self.m_milktea.m_state:

self.m_state = self.m_milktea.m_state

self.m_state["isbubble"] = 1

class coconut(decorater):

m_name = "椰凍"

m_cost = 2

def setstate(self):

if self.m_milktea.m_state:

self.m_state = self.m_milktea.m_state

self.m_state["iscoconut"] = 1

class decoratortest(object):

def run(self):

milkteatest = milktea("奶茶", 12)

print "-"*10,"milkteatest","-"*10

print milkteatest.getdescription()

print "花費了{}元".format(milkteatest.cost()) 

bubbletest = bubble(milkteatest)

print "-"*10,"bubbletest","-"*10

print bubbletest.getdescription()

print "花費了{}元".format(bubbletest.cost())

coconuttest = coconut(bubbletest)

print "-"*10,"coconuttest","-"*10

print coconuttest.getdescription()

print "花費了{}元".format(coconuttest.cost())

test = decoratortest()

test.run()

測試結果

四、優點

1、裝飾類和原類可以獨立實現,不會相互耦合,裝飾模式可以動態擴充套件乙個實現類的功能。

2、可替代繼承。

五、缺點

1、多層修飾比較複雜,會產生許多小物件。

裝飾器模式

大話設計模式 裝飾器模式 為已有功能動態地新增更多功能,當系統需要新功能,向舊的類中新增新功能,裝飾了原有類的核心職責和行為,而不改變它們 就像包裝袋一樣,有 的包裝袋包裝之前裝好東西的包裝袋 ifndef clothes h define clothes h include using names...

裝飾器模式

裝飾器設計模式 對真實物件動態的新增功能 抽象元件 author zhangjianbin public inte ce icar 俱體構件物件 真實的物件 author zhangjianbin class car implements icar 裝飾器物件 author zhangjianbin...

裝飾器模式

一 概念 裝飾模式能夠實現動態的為物件新增功能,是從乙個物件外部來給物件新增功能。通常給物件新增功能,要麼直接修改物件新增相應的功能,要麼派生對應的子類來擴充套件,抑或是使用物件組合的方式。顯然,直接修改對應的類這種方式並不可取。在物件導向的設計中,而我們也應該 盡量使用物件組合,而不是物件繼承來擴...