裝飾者模式:所謂裝飾,就是把這個裝飾者套在被裝飾者之上,從而動態擴展被裝飾者的功能。
裝飾著舉例
設計不同種類的飲料,飲料可以添加配料,比如可以添加牛奶,并且支持動態添加新配料。每增加一種配料,該飲料的價格就會增加,要求計算一種飲料的價格。
下圖表示在 DarkRoast 飲料上新增新添加 Mocha 配料,之后又添加了 Whip 配料。DarkRoast 被 Mocha 包裹,Mocha 又被 Whip 包裹。它們都繼承自相同父類,都有 cost() 方法,外層類的 cost() 方法調用了內層類的 cost() 方法。
以 InputStream 為例
InputStream 是抽象組件;FileInputStream 是 InputStream 的子類,屬于具體組件,提供了字節流的輸入操作;FilterInputStream 屬于抽象裝飾者,裝飾者用于裝飾組件,為組件提供額外的功能。例如 BufferedInputStream 為 FileInputStream 提供緩存的功能。
實例化一個具有緩存功能的字節流對象時,只需要在 FileInputStream 對象上再套一層 BufferedInputStream 對象即可。
DataInputStream 裝飾者提供了對更多數據類型進行輸入的操作,比如 int、double 等基本類型。