java的IO流一定是输入流或输出流的一种,不可能即是输入流又是输出流,因为java将InputStream和OutputStream两个顶层对象设置为两个抽象类,而java中又不可能同时继承两个类所以一个流只能是输入和输出流中的一种
IO流的分类主要有两类,一个是节点流,节点流是用来实际操作的流,是读取对应的实际数据的,比如从磁盘读取或者从内存区域读取等
一个是过滤流,不能单独存在依赖于节点流的存在而存在
java IO的设计是用的装饰者模式
装饰者模式主要是用来扩展 对象 的功能即new A(new B());这样的形式去实现
而继承则是用来扩展 类 的功能
这种模式可以在不创造更多子类的情况下给对象添加新的功能
装饰者模式的角色
抽象构建角色(Component):一个抽象的接口或抽象的类用来定义该对象比如InputStream
抽象构建角色的实现(Concrete Component):对应抽象构建角色的具体实现,即被装饰类,比如FileInputStream
装饰角色(Decorator):持有一个抽象构建角色,并定义一个与抽象构建角色相同的接口,拥有相同的方法,比如FilterInputStream,在java中该类继承了InputStream
实际装饰角色(Concrete Decorator):添加装饰的方法,例如BufferedInputStream
/**
* 装饰器模式主要的核心组件
* 1.装饰器的顶层接口或者类
* 2.装饰器的实际执行对象
* 3.装饰者的接口
* 4.实际的装饰者
* 装饰器是用来动态的扩展对象的功能的
* 继承则是用来静态的扩展类的功能
*/
//装饰器模式顶层接口或抽象类
public interface MyDecorator {
void say();
}
//被装饰者实现类
public class MyConceret implements MyDecorator {
@Override
public void say() {
System.out.println("功能A");
}
}
//装饰角色和被装饰者实现同样的接口(或抽象类)
public class MyDecoratorInt implements MyDecorator{
//持有一个实际被装饰者
private MyDecorator myDecorator;
public MyDecoratorInt(MyDecorator myDecorator){
this.myDecorator = myDecorator;
}
//调用被装饰者的方法
public void say(){
myDecorator.say();
}
}
//实际装饰者
public class MyDecoratorImp extends MyDecoratorInt {
//父类没有提供无参构造方法,此处必须写出来有参构造器
public MyDecoratorImp(MyDecorator myDecorator){
super(myDecorator);
}
//在实现类中调用父类该功能实现调用被装饰者的方法
@Override
public void say() {
super.say();
sayOther();
}
//实际装饰者提供的增强方法
private void sayOther(){
System.out.println("功能 B");
}
public static void main(String[] args) {
MyDecorator myDecorator = new MyConceret();
myDecorator.say();
}
}