大B:“在談及軟件中的結(jié)構(gòu),一般會(huì)用UML圖表示。”
小A:“喔。”
大B:“UML和ANT、JUnit等都是軟件設(shè)計(jì)中基本的工具,會(huì)了沒有啊!”
小A:“是嗎?”
大B:“我和你具體說說。1、Component就是裝飾器模式中公共方法的類,在裝飾器模式結(jié)構(gòu)圖的頂層。2、ConcreateComponent是轉(zhuǎn)換器模式中具體的被裝飾的類,IO包中的媒體流就是此種對(duì)象。3、Decorator裝飾器模式中的核心對(duì)象,所有具體裝飾器對(duì)象的父類,完成裝飾器的部份職能。剛纔的例子中Decorator類和這裡的對(duì)應(yīng)。該類可以只做一些簡單的包裹被裝飾的對(duì)象,也可以還包含對(duì)Component中方法的實(shí)現(xiàn)……它有一個(gè)鮮明的特點(diǎn):繼承至Component,同時(shí)包含一個(gè)Component作爲(wèi)其成員變量。裝飾器模式動(dòng)機(jī)中的動(dòng)態(tài)地增加功能是在這裡實(shí)現(xiàn)的。4、ConcreteDecoratorA和ConcreteDecoratorB是兩個(gè)具體的裝飾器對(duì)象,他們完成具體的裝飾功能。裝飾功能的實(shí)現(xiàn)是通過調(diào)用被裝飾對(duì)象對(duì)應(yīng)的方法,加上裝飾對(duì)象自身的方法。這是裝飾器模式動(dòng)機(jī)中的添加額外功能的關(guān)鍵。你可能還會(huì)發(fā)現(xiàn):ConcreteDecoratorA和ConcreteDecoratorB的方法不一樣,這就是一般設(shè)計(jì)模式中談及裝飾器模式的‘透明裝飾器’和‘不透明裝飾器’。‘透明裝飾器’就是整個(gè)Decorator的結(jié)構(gòu)中所有的類都保持同樣的‘接口’,這裡是共同方法的意思,這是一種極其理想的狀況,就像餐飲的例子一樣。現(xiàn)實(shí)中絕大多數(shù)裝飾器都是‘不透明裝飾器’,它們的‘接口’在某些子類中得到增強(qiáng),主要看這個(gè)類與頂層的抽象類或者接口是否有同樣的公共方法。IO中的ByteArrayInputStream就比Inputstrem抽象類多一些方法,因此IO中的裝飾器是一個(gè)‘不透明裝飾器’。”
小A:“喔。”
大B:“從IO中輸入字節(jié)流部分的裝飾器我們可以知道:1、InputStream是裝飾器的頂層類,一個(gè)抽象類!包括一些共有的方法,如:1、讀方法——read(3個(gè));2、關(guān)閉流的方法——close;3、mark相關(guān)的方法——mark、reset和markSupport;4、跳躍方法——skip;5、查詢是否還有元素方法——available。2、FileInputStream、PipedInputStream……五個(gè)紫色的,是具體的被裝飾對(duì)象。從它們的‘接口’中可以看出它們一般都有額外的方法。3、FilterInputStream是裝飾器中的核心,Decorator對(duì)象。4、DataInputStream、BufferedInputStream……四個(gè)是具體的裝飾器,它們保持了和InputStream同樣的接口。5、ObjectInputStream是IO字節(jié)輸入流中特殊的裝飾器,它不是FilterInputStream的子類,不知道Sun處於何種意圖不作爲(wèi)FileterInputStream的子類,其中流中也有不少的例子。它和其他FilterInputStream的子類功能相似都可以裝飾其他對(duì)象。IO包中不僅輸入字節(jié)流是採用裝飾器模式、輸出字節(jié)流、輸入字符流和輸出字符流都是採用裝飾器模式。”