看字面意思,装饰者就是把一个对象装饰一下,那么必要要有一个装饰着和被装饰着,被装饰者是比较原始的东西,比如一个原始的木门,大家都涂成各种颜色什么的,这里木门就是个被装饰者,各种颜料就是装饰着.装饰者要装饰被装饰者,必然要拥有一个被装饰着的对象,现在来看java I/O,I/O的本质是从文件,网络等地方读取字节流,FileInputStream是从文件中读取字节流,很原始了,它就是一个被装饰者,其他还有StringBufferInputStream,ByteArrayInputStream等,装饰着就是BufferdInputStream,猜测BufferdInputStream必然会有一个被装饰着的对象,它提供的功能是缓冲区,它可以给前面所有的被装饰者提供缓冲功能。先看headFirst设计模式一书给出的例子,比较好懂,现在假设FileInputStream已经读出字节了,要把读出来的字节中小写字母全部转化为大写字母,就是把FileInputStream装饰一下,设计一个这样的类:
public class LowerCaseInputStream extends FilterInputStream {
protected LowerCaseInputStream(InputStream in) {
super(in);//调用父类FilterInputStream,父类中持有一个被装饰者InputStream的对象
}
@Override
public int read() throws IOException {
int c = super.read();
return (c == -1)?c:Character.toLowerCase((char)c);
}
}
看LowerCaseInputStream,read方法相当于真正的装饰方法,要实现小写转大写的,如果传入一个FileInputStream,就持有了被装饰者对象,可以肆意的装饰它了,看怎么使用的:
String path = new String(System.getProperty("user.dir")+File.separator+"file/test.txt");
try {
InputStream is = new FileInputStream(path);//没有使用装饰者的时候
int c;
while((c=is.read())>0){
System.out.print((char)c);
}
System.out.println();
System.out.println("使用装饰者模式输出:");
InputStream myis = new LowerCaseInputStream(new FileInputStream(path));
while((c=myis.read())>0){
System.out.print((char)c);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
输出:
bCd
使用装饰者模式:
bcd
很简单,一个自己的装饰者就做好了,当然你还可以有其他装饰着,如BufferdInputStream等,像下面使用:
InputStream myis = new BufferedInputStream(new LowerCaseInputStream(new FileInputStream(path)));
这样就有两个装饰着同时修饰FileInputStream了。很难理解为什么要这么用,直接用FileInputStream读出来然后再转大小写不行吗?可以这样来理解,木门为什么不直接在生产的时候就加个搞的比较好看呢?,因为木门需求还没有完全确定,每个用户需要的颜色都不一样,也就是说木门只提供最基本的功能,看FileInputStream类,它也只提供最基本的功能,如读写字节什么的,但是至于什么缓冲功能,大小写转换就需要等程序员想用的时候自己来选择,在java I/O中,FileInputStream和BufferedInputStream都继承InputStream,我的理解是:会有很多装饰者和很多被装饰者,但是装饰者要持有被装饰者的对象,假设FileInputStream等被装饰者都继承了InputStream了,这样只要传入一个InputStream进去装饰着BufferedInputStream,它就能持有所有被装饰的对象了,那么BufferedInputStream为什么还有继承InputStream呢?因为像这样的代码:
new LowerCaseInputStream(new FileInputStream(path),把被装饰者装饰了之后返回的对象是什么呢?必要还要返回被装饰者的对象,你不能把门涂层颜色就不是门了吧?所以装饰着也继承于InputStream,但是它不是直接继承InputStream,而是继承FilterInputStream,但是FilterInputStream继承InputStream,有一层FilterInputStream间接来继承InputStream,而继承与FilterInputStream的所有子类都是装饰者类,在FilterInputStream中持有一个被装饰者类的对象,这样子类就不用持有了被装饰者对象了,都从父类FilterInputStream继承过来了。最后看一下java I/O的BufferedInputStream源代码:
public BufferedInputStream(InputStream in) {
this(in, defaultBufferSize);
}
public synchronized int read() throws IOException {
if (pos >= count) {
fill();//这里面会调用被装饰者的read方法
if (pos >= count)
return -1;
}
return getBufIfOpen()[pos++] & 0xff;
}
其实它跟LowerCaseInputStream是一样的,构造函数接受一个InputStream的被装饰者,read函数是具体的装饰功能。最后上个java I/O的包图结构
java.io.InputStream (implements java.io.Closeable)
从中可以看出FilterInputStream是跟其他的FileInputStream等平行的,都是继承InputStream,FilterInputStream的子类都是装饰者类。
分享到:
相关推荐
NIO(Non-blocking I/O)是Java编程语言中用于I/O操作的一种新模式。与传统Java I/O(即面向流的阻塞I/O)不同,NIO提供了面向缓冲区的、基于通道的I/O操作方法。NIO的支持被引入JDK1.4版本,它允许快速地读写数据,...
《深入浅出Java设计模式》是一本专注于Java编程领域中的设计模式专著,旨在帮助开发者深化对设计模式的理解,提高代码质量和可维护性。设计模式是软件开发中经过时间检验的解决方案,它们是解决常见问题的最佳实践。...
【Java面试题】谈谈对Java多态的理解
在eclipse中运行如下代码,很多小伙伴在纠结到底应该是多少,其实正确结果应该是0!!! int i = 0; i = i++; System.out.println("i的值是 : " + i); 这是和JVM的内存分配有关,JVM在处理这段带代码时,会先把i++的...
对 Java 中多态理解 Java 中的多态是指在不同的情况下可以有不同的行为,多态是面向对象编程的一种基本特征。多态的实现是通过方法重载和方法重写来实现的。 在 Java 中,多态可以分为两种:编译时多态和运行时...
面试中,对Java平台的理解不仅包括语言特性和基础类库,如集合框架、输入/输出(IO/NIO)、网络编程、多线程、安全等,还涉及到JVM的深入理解。比如,Java的类加载机制,包括Bootstrap、Application和Extension ...
3. **I/O操作**:Java NIO(非阻塞I/O)提供了一种更高效的I/O模型,适用于高并发场景。了解并熟练使用NIO可以显著提升I/O密集型应用的性能。 4. **算法选择**:针对特定问题,选择合适的数据结构和算法能显著提高...
Java平台是一个涵盖广泛的技术体系,它的核心在于Java编程语言、Java虚拟机(JVM)以及丰富的...在面试过程中,展示出对Java平台全面且深入的理解,将有助于展现自己的专业素养和学习态度,从而增加面试成功的几率。
接下来,我们谈谈Java NIO(New IO),这是Java 1.4引入的一个新特性,提供了非阻塞I/O模型。与传统的IO相比,NIO更注重于通道(Channels)和缓冲区(Buffers)的使用,而非流。NIO的主要优点在于其非阻塞特性,可以...
"谈谈对Java的认识" Java是一种高级编程语言,它的出现改变了整个软件开发的战略, 从单机时代向着以网络为中心的计算机时代转移。Java语言的特点包括简单、高级、面向对象、分布式、解释型、健壮、安全、体系结构...
首先,让我们谈谈Java中的I/O流。I/O流是Java中处理数据输入和输出的关键机制。Java提供了丰富的类库来支持各种类型的流,如字符流和字节流,它们分为四大类:输入流(InputStream/Reader)、输出流(OutputStream/...
在Java编程语言中,对象和引用的理解是至关重要的,它们构成了Java程序的基础。本文将深入探讨Java中的对象、引用以及它们之间的关系,并结合值传递的概念进行解析。 首先,我们需要理解什么是Java对象。在Java中,...
当正在开发或者理解一个程序设计时,最好的方法之一就是将对象想象为“服务提供者”,你的目标就是去创建(或者最好是在现有代码库中寻找)能够提供理想的服务来解决问题的一系列对象。例如,在一个电子商务系统中,...
第01讲丨谈谈你对Java平台的理解?.html
在本压缩包“使用Java理解程序逻辑第13章.zip”中,我们聚焦于Java编程语言,特别是JavaSE(Java Standard Edition)的基础知识。JavaSE是Java的核心部分,用于开发桌面应用程序,它提供了丰富的类库和API,使得...
设计模式分为三类:创建型模式(如单例模式、工厂模式、建造者模式、原型模式)、结构型模式(如适配器模式、桥接模式、装饰器模式、外观模式、组合模式、代理模式)和行为型模式(如策略模式、观察者模式、责任链...
Java NIO(New IO)是Java 1.4版本引入的一个新模块,它提供了一种不同于传统IO(基于字节流和字符流)的I/O操作方式。传统的IO模型是阻塞式的,而NIO的核心特点是非阻塞,这使得在处理大量并发I/O请求时更为高效。...
此外,Java NIO(New IO)提供了非阻塞I/O模型,适用于高并发的网络应用,虽然在坦克大战这样的桌面游戏中可能用得较少,但了解其原理和用法对提升编程技能依然有价值。 总的来说,《坦克大战 myself.zip》这款游戏...
"结合自己的专业谈谈对自然辩证法的理解" 本文将探讨自然辩证法在人工智能领域的应用和影响,讨论人工智能的发展对人类和自然的关系的影响,并探讨自然辩证法在人工智能发展中的指导意义。 首先,自然辩证法揭示了...
本框架的核心是基于Reactor事件机制,这是一种用于处理I/O事件的模式,广泛应用于高性能服务器开发。Reactor模式通过集中处理所有I/O事件,使得系统能够以非阻塞方式处理大量并发连接,从而提高服务的响应速度和系统...