簡(jiǎn)介
裝飾類的核心就是增強(qiáng)相關(guān)類的功能牌废,著名的JAVA自帶的裝飾類就有BufferedWriter、BufferedReader、BufferedInputStream和BufferedOutputStream,大家也可以看看我寫的兩篇文章
BufferedOutputStream和BufferedInputStream那些事兒
BufferedOutputStream和BufferedInputStream那些事兒
裝飾類和子類的區(qū)別
根據(jù)簡(jiǎn)介以及兩篇文章癣亚,大家其實(shí)能夠發(fā)現(xiàn)蛤虐,它們都是針對(duì)已有的功能進(jìn)行加強(qiáng),然后增強(qiáng)其功能涂滴,說(shuō)到這個(gè)其實(shí)很多人會(huì)想到另外一個(gè)類
子類
是的友酱,我們也完全能夠用子類來(lái)代替裝飾類,但是這里用子類也會(huì)引起一些問(wèn)題
裝飾類過(guò)多
我們還是用上面幾個(gè)的四個(gè)系統(tǒng)自帶的裝飾類來(lái)說(shuō)明一下柔纵,我們可以得到這樣一個(gè)體系
Reader
|------FileReader
Writer
|------FileWriter
如果我們都用子類來(lái)實(shí)現(xiàn)增強(qiáng)功能的作用缔杉,就會(huì)得到
Reader
|------FileReader
|------------BufferedFileReader
Writer
|------FileWriter
|------------BufferedFileWriter
這樣,每個(gè)子類需要對(duì)應(yīng)一個(gè)修飾類搁料,后續(xù)我們?cè)偌恿俗宇惢蛳辏遣皇怯忠o接著加子類呢?
比如說(shuō)加缘,添加MediaWriter,MediaReader,Mp3Writer,,Mp3Reader
顯然鸭叙,麻煩
擴(kuò)展性差
其實(shí)上文就說(shuō)道了,我們每次加一個(gè)子類就需要加一個(gè)緩沖子類拣宏,過(guò)于麻煩復(fù)雜沈贝,所以我們不推薦這樣子操作
因此,裝飾類橫空出現(xiàn)
我們可能剛開(kāi)始只能夠想到這樣子的裝飾類
BufferedFileReader(FIleReader r)
BufferedMediaReader(MediaReader r)
BufferedMp3Reader(Mp3Reader r)
BufferedFileWriter(FIleWriter w)
BufferedMediaWriter(MediaWriter w)
BufferedMp3Writer(Mp3Writer w)
顯然麻煩勋乾,我們能夠提高一下效率宋下?
BufferedWriter(Writer w)
BufferedReader(Reader r)
我們用父類實(shí)現(xiàn)這個(gè)想法
寫到這里,有沒(méi)有機(jī)智的伙伴想問(wèn)辑莫,那我就不能夠用父類作為修飾類的直接子類嗎学歧?
這樣子
Reader
|-------BufferedReader
Writer
|-------BufferedWriter
這樣子想的伙伴很好,但是我想問(wèn)的就是這不就是直接把FileReader和BufferedFileReader直接合成一個(gè)了嗎各吨?
而且我們用裝飾類只是為了在原來(lái)的基礎(chǔ)功能上添加一些功能枝笨,增加某些功能(并不是全部功能),這樣子等于是徹底改寫揭蜒,整個(gè)類也會(huì)變得更加龐大
為了更好的說(shuō)明横浑,我來(lái)寫一個(gè)自己的BufferedReader的修飾類
自定義的BufferedReader
import java.io.FileReader;
public class myBufferedReader {
FileReader fr=null;
myBufferedReader(FileReader fr)
{
this.fr=fr;
}
public String readLine() throws Exception{
StringBuilder sb=new StringBuilder();
int ch;
char c;
while((ch=fr.read())!=-1)
{
c=(char)ch;
if(c=='\r')
continue;
else if(c=='\n')
return sb.toString();
else
sb.append(c);
}
if(sb.length()!=0)
return sb.toString();
return null;
}
void close() throws Exception {
fr.close();
}
}
總結(jié)
裝飾類的本質(zhì)就是能夠?qū)σ恍╊愡M(jìn)行功能增強(qiáng)并且能夠添加一些功能,同時(shí)能夠很好的保證代碼的容量屉更,避免創(chuàng)建過(guò)多的類徙融,所以我們?cè)谛枰獙?duì)一些類進(jìn)行修飾和功能增強(qiáng)時(shí),盡可能多考慮用修飾類瑰谜,只需要傳一個(gè)對(duì)象就能夠操作了
欺冀。我舉個(gè)例子树绩,如果我們那一天把某一個(gè)類給刪了,用來(lái)修飾的子類是不是就整體廢除了隐轩?但是修飾類很可能就不必饺饭,因?yàn)樗灰欢ㄊ撬闹苯有揎椬宇悺T倩蛘呶覀冃枰獙?duì)某一個(gè)類進(jìn)行功能增強(qiáng)职车,我們也可以不必創(chuàng)建子類砰奕,也不用去查看它的子類,我在不創(chuàng)建的情況下我們可以利用修飾類來(lái)完成提鸟。