java的IO中主要有适配器和装饰器两种设计模式。简要说明下这两种设计模式,适配器,生活中就有这个东西嘛,现在很多手机取消了耳机孔,用一个适配器你就可以用type-C充放口听歌了。即,将一个接口适配到另一个接口。
IO中有一个很常见的场景,把字符串转化为字节保存到文件中,用type-c口听歌,很像对吧,这里就用到了适配器模式。
public class Adapter {
public static void main(String[] args) throws Exception{
FileOutputStream fileOutputStream=new FileOutputStream("/test");
OutputStreamWriter outputStreamWriter=new OutputStreamWriter(fileOutputStream);
outputStreamWriter.write("this is my test");
}
}
可以看到这里的适配器就是OutputStreamWriter 类,本来源角色 fileOutputStream 是不能直接写入字符串的,通过OutputStreamWriter 实现了这一需求。
public class OutputStreamWriter extends Writer {
private final StreamEncoder se;
}
这里我们要直接传入字符串进行写文件,所以需要实现writer,而FileOutputStream只实现了OutputStream,这里的OutputStreamWriter 实现了writer,同时,OutputStreamWriter 中通过引用StreamEncoder间接引用了OutputStream,最终实现写字符串。
接着来聊一聊IO中的装饰者模式
public class Decorator {
public static void main(String[] args) throws Exception{
InputStream inputStream=new FileInputStream("/test");
BufferedInputStream bufferedInputStream=new BufferedInputStream(inputStream);
}
}
class BufferedInputStream extends FilterInputStream {
}
可以看到BufferedInputStream 其实是 FilterInputStream 的子类,我们知道子类继承并丰富父类的功能,所以这也是我们装饰者模式的设计目的,由装饰器实现者增强装饰角色的功能,这里我们通过BufferedInputStream 给FilterInputStream 增加了功能,使得其读取的数据可以保存在内存中。
总而言之,装饰器和适配器模式看似都是包装一个对象或者类,他们都有一个别名叫包装模式,然而,二者设计目的不一样,适配器是将一个接口转变为另一个接口,装饰器则是丰富原有接口的功能,增强原有对象