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