装饰器模式
「装饰模式(Decorator)」,在不改变现有对象结构的情况下,动态地给一个对象添加一些额外的职责的模式,就增加功能来说,装饰模式比生成子类更灵活。
装饰模式在IO
中使用广泛,例如缓存流BufferedInputStream
,如下图,BufferedInputStream
继承FilterInputStream
,而FilterInputStream
和FileInputStream
类同级,所以当FileInputStream
需要使用缓冲流加强时,只需要将这个类作为参数传入缓冲流即可。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NEhxP8RU-1681653832672)(D: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」做实现即可。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zIR6HnKz-1681653832674)(D:对象适配器.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
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rurtrQAz-1681653832675)(D:类适配器.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;
}
参考文献
Java设计模式-结构型-适配器模式
原文始发于微信公众号(写代码的ZaytonSquid):聊聊Java IO中的设计模式
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/246356.html