定義:
動態地將責任附加到物件上。若要擴充套件功能,裝飾者提供了比繼承更有彈性相信大家應該都吃過火鍋了,火鍋中鍋底是必須的,至於其他的配菜就需要自己點了。的替代方案。
下面以火鍋來談談裝飾者模式。
首先需要建立乙個火鍋的物件,後面鴛鴦火鍋,麻辣火鍋,清湯火鍋等都繼承它
abstract
class
pot//**,由子類實現
public
abstract
double
price()
;}
因為每個鍋底的**都不一樣,所以寫乙個抽象的price()方法,由子類決定**。
然後定義定義火鍋的例項: 清湯鍋底、鴛鴦鍋底等。
清湯鍋底:
class
clearsouppot
extends
pot@override
public
double
price()
}
鴛鴦鍋底
class
yuanyangpot
extends
pot@override
public
double
price()
}
鍋底已經鍵好了,現在我們需要加配菜了。首先建立乙個配菜的抽象類,所有配菜都繼承自它。
abstract
class
garnish
extends
pot
因為我們的配菜是來搭配火鍋的,所以要繼承pot類。
//蔬菜類
class
garnishvegetables
extends
garnish
@override
public string getname()
@override
public
double
price()
}
為了讓配菜類能夠引用到火鍋物件,所以在初始化的時候傳入火鍋物件。
同理建立garnishduckblood、garnishshrimp鴨血和蝦的類。
現在我們可以點乙份喜歡的火鍋了。
public
static
void
main
(string[
] args)
執行結果如下:
鴛鴦鍋底 +鴨血 +蔬菜
57.0
清湯鍋底 + 蝦 +蔬菜
77.0
這裡我們可以把火鍋當初乙個被裝飾的物件,它初始時只有對應的鍋底。而各種配菜則是裝飾品,新增到火鍋中,使其具有不同的配菜。
通過裝飾者模式,可以動態的給物件新增一些額外的職責。
裝飾者模式的通用結構
component 是乙個介面或抽象物件,是我們定義的最基本、最核心的元件。是被修飾的物件父類,如上面的火鍋類pot。
concretecomponent 是元件component 的實現類,是我們要裝飾的具體物件,如上面的鴛鴦鍋,清湯鍋。
一般是乙個抽象類,繼承自component。
繼承自decorator 類,是裝飾者decorator 的例項。如上面的蔬菜,鴨血,蝦都是裝飾者
component :元件定義
abstract
class
component
concretecomponent 元件的例項物件定義
class
concretecomponent
extends
component
}
decorator 抽象裝飾者
abstract
class
decorator
extends
component
//委託給被修飾者執行
@override
void
operate()
}
concretedecoratora、concretedecoratorb具體的裝飾類定義
class
concretedecoratora
extends
decorator
//定義自己的修飾方法
private
voidm1(
)//重寫父類方法
@override
void
operate()
}class
concretedecoratorb
extends
decorator
public
voidm2(
)//重寫父類方法
@override
void
operate()
}
執行裝飾者模式:
public
static
void
main
(string[
] args)
執行結果:
方法2 修飾
方法1 修飾
做一些事
優缺點
裝飾者模式可以動態的增加類的功能,但如果使用過量會增加會出現很多小物件,讓程式變得複雜。
參考:《head first設計模式》
裝飾者模式
裝飾者模式 動態地將責任附加到物件上。若要擴張功能,裝飾者提供了比繼承更有彈性的替代方案。裝飾者可以在所委託被裝飾者的行為之前或之後,加上自己的行為,以達到特定的目的。裝飾者與被裝飾者物件具有相同的超型別。include include using namespace std class bever...
裝飾者模式
裝飾者模式,是在不改變原類檔案和使用繼承的情況下,動態地擴充套件乙個物件的功能。它是通過建立乙個包裝物件,也就是裝飾來包裹真實的物件。裝飾者模式中的角色 1 被裝飾者抽象component,是乙個介面或抽象類,就是定義最核心的物件,也是最原始的物件,這個類是需要裝飾類的基類。2 被裝飾者具體實現co...
裝飾者模式
裝飾者模式 裝飾者模式的好處是便於擴充套件,對乙個東西不管怎麼變,只需要找到相應的元件去改變它 1.如何組裝在一起 建立主題 packetbodycreator body new packetbodycreator 建立header packethtmlheadercreator html new ...