Starbuzz咖啡店裏有很多種咖啡,並且深受消費者喜愛,擴張速度非常快,以後可能會陸續增加其他的咖啡種類。
購買咖啡時,也可以要求在其中加入各種調料,例如:蒸奶(Steamed Milk)、豆漿(Soy)、摩卡(Moka,也就是巧克力口味)或覆蓋奶泡。Starbuzz會根據所加入的調料收取不同的費用。所以訂單必須考慮到這些調料部分。
問題來了:如何動態的添加各種調料呢?畢竟不同調料的價格不同,且以後添加了新的咖啡種類也不用修改已有的調料代碼。
設計原則:
類應該對擴展開放,對修改關閉。
裝飾者模式:
動態地將責任附加到對象上。若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案。
特點:
1、裝飾者和被裝飾者對象有相同的超類型。
2、你可以用一個或多個裝飾者包裝一個對象。
3、既然裝飾者和被裝飾者對象有相同的超類型,所以在任何需要原始對象(被包裝的)的場合,可以用裝飾過的對象代替它。
4、裝飾者可以在所委託被裝飾者的行爲之前與/或之後,加上自己的行爲,以達到特定的目的。
5、對象可以在任何時候被裝飾,所以可以在運行時動態地,不限量地用你喜歡的裝飾者來裝飾對象。
Java I/O 就是用裝飾者模式實現的!