简介
装饰类的核心就是增强相关类的功能,著名的JAVA自带的装饰类就有BufferedWriter、BufferedReader、BufferedInputStream和BufferedOutputStream,大家也可以看看我写的两篇文章
BufferedOutputStream和BufferedInputStream那些事儿
BufferedOutputStream和BufferedInputStream那些事儿
装饰类和子类的区别
根据简介以及两篇文章,大家其实能够发现,它们都是针对已有的功能进行加强,然后增强其功能,说到这个其实很多人会想到另外一个类
子类
是的,我们也完全能够用子类来代替装饰类,但是这里用子类也会引起一些问题
装饰类过多
我们还是用上面几个的四个系统自带的装饰类来说明一下,我们可以得到这样一个体系
Reader
|------FileReader
Writer
|------FileWriter
如果我们都用子类来实现增强功能的作用,就会得到
Reader
|------FileReader
|------------BufferedFileReader
Writer
|------FileWriter
|------------BufferedFileWriter
这样,每个子类需要对应一个修饰类,后续我们再加了子类,是不是又要紧接着加子类呢?
比如说,添加MediaWriter,MediaReader,Mp3Writer,,Mp3Reader
显然,麻烦
扩展性差
其实上文就说道了,我们每次加一个子类就需要加一个缓冲子类,过于麻烦复杂,所以我们不推荐这样子操作
因此,装饰类横空出现
我们可能刚开始只能够想到这样子的装饰类
BufferedFileReader(FIleReader r)
BufferedMediaReader(MediaReader r)
BufferedMp3Reader(Mp3Reader r)
BufferedFileWriter(FIleWriter w)
BufferedMediaWriter(MediaWriter w)
BufferedMp3Writer(Mp3Writer w)
显然麻烦,我们能够提高一下效率?
BufferedWriter(Writer w)
BufferedReader(Reader r)
我们用父类实现这个想法
写到这里,有没有机智的伙伴想问,那我就不能够用父类作为修饰类的直接子类吗?
这样子
Reader
|-------BufferedReader
Writer
|-------BufferedWriter
这样子想的伙伴很好,但是我想问的就是这不就是直接把FileReader和BufferedFileReader直接合成一个了吗?
而且我们用装饰类只是为了在原来的基础功能上添加一些功能,增加某些功能(并不是全部功能),这样子等于是彻底改写,整个类也会变得更加庞大
为了更好的说明,我来写一个自己的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();
}
}
总结
装饰类的本质就是能够对一些类进行功能增强并且能够添加一些功能,同时能够很好的保证代码的容量,避免创建过多的类,所以我们在需要对一些类进行修饰和功能增强时,尽可能多考虑用修饰类,只需要传一个对象就能够操作了
。我举个例子,如果我们那一天把某一个类给删了,用来修饰的子类是不是就整体废除了?但是修饰类很可能就不必,因为它不一定是它的直接修饰子类。再或者我们需要对某一个类进行功能增强,我们也可以不必创建子类,也不用去查看它的子类,我在不创建的情况下我们可以利用修饰类来完成。