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