0. 序
裝飾模式–> 使用物件組合的方式,在執行時裝飾類。 可以在不修改任何底層**的情況下,給物件賦予新的職責
1. 咖啡店例項
問題所在:乙個飲料抽象父類beverage , 當子類過多時,出現類的**性複雜
很明顯,這是難以維護的,出現乙個新的飲料就要去繼承父類。
一種特例:雙倍奶泡咖啡,算一種飲料,三倍奶泡咖啡,… 無盡種類的飲料出現了。
違反了兩個原則???
原則:開發-閉合(免於改變 能夠擴充套件)
目標:允許類容易擴充套件,在不修改現有**的情況下,就可搭配新的行為。
ok, 這裡針對上述飲料的繼承問題:類數量**,設計死板,難以維護,且基類的功能不適用所有子類。
裝飾模式如何裝飾?假設顧客要摩卡和奶泡深培咖啡,以飲料為主體,使用調料來裝飾:
這裡的例子是外層的cost依賴裡面的cost的結果。
**顯然:**裝飾者可以在被委託的裝飾者的行為之前與之後,加上自己的行為,達到特定的目的。–>如何去實現???
裝飾者與被裝飾者超類相同。–> 要使裝飾者能取代被裝飾者,多型。
2. 定義裝飾者模式
裝飾者模式動態把職責附加到物件上。在擴充套件上,比繼承更有彈性。
針對caffe例項的觀察者類圖:
顯然:要把飲料當成被裝飾者,調料當初裝飾者。
ques:既然面向介面程式設計,為什麼不把beverage設計成介面,而要當作乙個抽象類?
ans:(書上的解答)從最初的程式開始,beverage就是乙個抽象類,通常裝飾者模式是採用抽象類,也可以使用介面。但是,**避免去修改現有的**。**畢竟現有的**一般問題少,修改後可能會產生新的問題。。。
3. **
這章節理論上理解是好理解,但之前沒有實現過 我覺得實現還是有點難,故寫一下**。
/**
* 抽象基類
*/public
abstract
class
beverage
public
abstract
double
cost()
;}
被裝飾者
/**
* 濃縮咖啡
*/public
class
espresso
extends
beverage
@override
public
double
cost()
}/**
* 混合--黑咖啡
*/public
class
houseblend
extends
beverage
public
houseblend()
}
裝飾者–抽象出乙個基類
/**
* 裝飾類 --> 調料
*/public
abstract
class
condiment
extends
beverage
}
裝飾者
/**
* 裝飾者 摩卡
*/public
class
mocha
extends
condiment
@override
public string getdescription()
public
double
cost()
}//其他裝飾者類似
實現starbuzzcoffee
public
class
starbuzzcoffee
}
實現小杯,中杯,大杯
public
abstract
class
cupsize
extends
beverage
}public
class
smallcup
extends
cupsize
@override
public
double
cost()
public
smallcup
(beverage beverage)
}
這個例子相當於是把杯子大小當成一種配料,但問題很明顯:有三個類。書上的例子是在超類beverage中加入size屬性,然後只用乙個sizede類來裝飾,在裡面判斷size==small|mid|big來增加**。
上述問題剩下:如何去委託?什麼是委託?
我的理解:就如計算caffee**,實際上 咖啡被配料委託,咖啡的**最終是依賴配料的**計算的。將caffee委託給配料,在配料(即裝飾者)中加入caffee(組合)。這樣就通過cost方法一層層呼叫得到**。
設計模式3 裝飾者模式
動態的將責任附加到物件上。想要擴充套件功能,裝飾者提供有別於繼承的另一種選擇 封裝變化 多用組合,少用繼承 針對介面程式設計,不針對實現程式設計 為互動物件之間的松耦合設計而努力 對擴充套件開放,對修改關閉 在購買咖啡時,可以要求在其中加入各種調料,例如 蒸奶,豆漿,摩卡等其他調料,會根據加入的不同...
設計模式 (3)裝飾者模式
動態的將責任附加到物件上,在擴充套件功能上,裝飾者提供了比繼承更有彈性的替代方案。維護了開放封閉原則 對擴充套件開放,對修改封閉 將裝飾者和具體元件組合,就是在加入新的行為。組合和委託可以在執行時動態的加上新的行為。而繼承雖然也屬於擴充套件形式之一,但是非彈性設計,而且依賴繼承,類的行為只能在編譯時...
設計模式 裝飾者模式
public abstract class beverage public abstract double cost public abstract class condimentdecorator extends beverage public class darkroast extends be...