繼承可以在復(fù)用父類(lèi)代碼的情況下擴(kuò)展父類(lèi)的功能,但同時(shí)繼承增加了對(duì)象之間的耦合度,所以要慎用繼承。那么有沒(méi)有既能擴(kuò)展父類(lèi)的功能,又能使對(duì)象間解耦的方法呢?答案是肯定的,這就是我們今天要學(xué)習(xí)的裝飾者模式。待會(huì)你會(huì)看到我會(huì)用裝飾者模式組裝一臺(tái)電腦。不過(guò)現(xiàn)在還是先把書(shū)上的例子學(xué)習(xí)一下。
學(xué)習(xí)書(shū)上的例子
Starbuzz咖啡店的系統(tǒng)需要更新一下,他們?cè)瓉?lái)的系統(tǒng)是這樣的:
可以看到,顧客購(gòu)買(mǎi)飲料時(shí)有具體的子類(lèi)提供并返回飲料的價(jià)格。購(gòu)買(mǎi)咖啡時(shí),可以在其中加入一些調(diào)料,比如蒸奶(Steamed Milk)、豆?jié){(Soy)、摩卡(Mocha,也就是巧克力風(fēng)味)或覆蓋奶泡。Starbuzz會(huì)根據(jù)所加入的調(diào)料收取不同的費(fèi)用。那么這怎么做呢?也許我們會(huì)想到這樣的幾種解決方法:
1.列出所有的飲料和調(diào)料的組合方式。好吧,我想沒(méi)有人會(huì)這么做,這樣組合情況太多,用書(shū)上的一種說(shuō)法叫“類(lèi)爆炸”。
2.在Beverage類(lèi)中設(shè)置各種調(diào)料的boolean值以表示是否需要這種調(diào)料,如boolean milk, 然后用cost計(jì)算出加入各種調(diào)料后的價(jià)格,然后在子類(lèi)的cost方法中調(diào)用父類(lèi)的cost方法并加上飲料本身的價(jià)格。
分析第2中情況:聽(tīng)起來(lái)還不錯(cuò),但一旦加入新的調(diào)料就得修改Beverage類(lèi)。如果研究出了一種新型的飲料,里面的某些調(diào)料可能并不合適,這樣導(dǎo)致了飲料擁有加入不合適的調(diào)料的方法,這樣有什么后果,這樣可能會(huì)出現(xiàn)一些不好的后果,我們?cè)?a href="http://www