装饰器模式
装饰模式(Decorator),在不改变现有对象结构的情况下,动态地给一个对象添加一些额外的职责的模式,就增加功能来说,装饰模式比生成子类更灵活。
装饰模式在IO
中使用广泛,例如缓存流BufferedInputStream
,如下图,BufferedInputStream
继承FilterInputStream
,而FilterInputStream
和FileInputStream
类同级,所以当FileInputStream
需要使用缓冲流加强时,只需要将这个类作为参数传入缓冲流即可。
![BufferedInputStream]./images/BufferedInputStream.png)
BufferedInputStream
的构造函数其中的一个参数就是 InputStream
。
public BufferedInputStream(InputStream in, int size) {
super(in);
if (size <= 0) {
throw new IllegalArgumentException("Buffer size <= 0");
}
buf = new byte[size];
}
适配器模式
适配器主要用来协调接口不兼容,就比如笔记本电脑端口外界显示屏,端口不匹配,就需要一个适配器来将两边连接起来。那么在了解IO
中的适配器模式前,我们先了解下适配器分为两种形式:对象适配器和类适配器。
对象适配器
如下图所示,我们希望Something类拥有Target类的行为,我们就可以编写一个适配器,将Something组合到适配器中,然后继承Target接口,用Something做实现即可。
![对象适配器]./images/对象适配器.png)
例如IO
中使用InputStreamReader
实现InputStream
转为BufferedReader
public InputStreamReader(InputStream in) {
super(in);
try {
sd = StreamDecoder.forInputStreamReader(in, this, (String)null); // ## check lock object
} catch (UnsupportedEncodingException e) {
// The default encoding should always be available
throw new Error(e);
}
}
类适配器
如下图,Something类向拥有Target的行为我们就编写一个适配器,继承Something、Target,用Target方法封装Something
![类适配器]./images/类适配器.png)
工厂模式
工厂模式用于创建对象,比如 Files
的newInputStream
就是用静态工厂模式,代码使用示例如下。
InputStream is Files.newInputStream(Paths.get(generatorLogoPath))
观察者模式
NIO
中的Watchable
使用到了观察者模式。Watchable
接口定义了register
方法,调用者只需将监控事件WatchService
以及回调事件events
都作为参数传入即可完成事件的观察和响应。
public interface Watchable {
WatchKey register(WatchService watcher,
WatchEvent.Kind<?>[] events,
WatchEvent.Modifier... modifiers)
throws IOException;
WatchKey register(WatchService watcher, WatchEvent.Kind<?>... events)
throws IOException;
}