从设计模式看Java IO

一、装饰者模式

一个类的功能扩展可以有两种方式 :

(1) 类的继承 ( 高耦合,会产生更多的子类,从而引起类的爆炸 )

(2) 对象组合即装饰模式 ( 降耦,不会创造更多的子类 ) 动态的为对象添加功能) 所以类应该对扩展开放,对修改关闭 。

装饰者设计模式注意事项:

(1) 装饰者和被装饰者必须具有相同的超类型。

(2) 装饰者即可以包装被装饰者,也可以包装装饰者。往往利用多层包装来达到目的。

(3) 装饰者中组合了被装饰者对象 ( 装饰类的关键特征 ) 。使得我们能够通过嵌套装饰来动态扩展行为。

四个概念:

(1) 抽象的构件角色( Component):
它是一个接口,封装了将要添加的功能(方法)。
它相当于 IO 中的 InputStream 。( 或 OutputStream )

(2) 具体的构件角色( ConcreteComponent ):
它是一个类,该类实现了 Component 接口,因此该类中封装了将要添加的功能的一种实现方法。

(3) 装饰角色( Decorator): 它是一个类,该类也实现了 Component 接口,同时也必须持有接口 Component 的对象的引用,
该类也实现了 Component 接口中的方法。
a: 该类的构造方法需要传递过来一个 Component 对象的引用。
b: 重写的方法(即是添加的功能)需要调用 Component 对象的该方法。

(4) 具体的装饰角色( Decorator 类的子类,可以有一个,也可以有多个):
这些类继承了类 Decorator, 要重写父类的方法(要添加的功能),和自身的构造方法。
a: 构造方法要用到 super。
b: 第一步: super 父类的该方法。
     第二步:添加自己的功能(一些句子)。

装饰者 :Java IO 框架和 Collection 框架

( 一 ) Java IO 框架 J DK5.0 中 60 多个 IO 流类组成了四大家族: InputStream , OutputStream , Reader , Writer 。

InputStream / OutputStream 是对字节序列进行操作的抽象类。

Reader/Writer 是基于 Unicode 代码单元进行操作的抽象类。

InputStream 具有读入功能的抽象被装饰器。

FileInputStream   具有读入文件功能的具体被装饰器

FilterInputStream   具备装饰器的抽象意义

BufferedInputStream    具有具体功能 ( 缓冲功能 ) 的装饰器

 InputStream :字节序列输入类鼻祖 ---------------------- Component

• public abstract class InputStream implements Closeable

• 最基本的读取字节的抽象方法,供子类扩展。

• public abstract int read() throws IOException ;

 FileInputStream : 读取文件中的字节流类 继承 InputStream ------------ ConcreteComponent

• public class FileInputStream extends InputStream

• 构造函数

• public FileInputStream (String name) throws FileNotFoundException

• 本地方法,与操作系统低层交互的具体读入方法

• public native int read() throws IOException ; ( 基于本地方法的底层实现 ,java 调用非 java 程序实现 )

• FilterInputStream : 过滤流类,起装饰器作用,用于对输入装配各种功能 ------------ Decorator

• public class FilterInputStream extends InputStream

• 用于记录被装饰者,也就是需要装配新功能的 InputStream 对象

• protected volatile InputStream in;

• 构造装饰器  in 用来设置需要被包装 InputStream 对象

• protected FilterInputStream ( InputStream in) { this.in = in; // 设置需要被包装 InputStream 对象 }

• 读入字节

• public int read() throws IOException { return in.read (); }

• BufferedInputStream : 使输入流具有缓冲功能,是一种可以装配缓冲功能的装饰器,继承 FilterInputStream ------------------ConcreteDecorator

• public class BufferedInputStream extends FilterInputStream

• // 构造器      in 就是被装配缓冲功能的 InputStream

public BufferedInputStream ( InputStream in) { this(in, defaultBufferSize );

public readLine(){}

时间: 2025-01-15 15:04:03

从设计模式看Java IO的相关文章

Java IO——堵塞式

目录     1.  File类   2.  InputStream和OutputStream   3.  Reader和Writer   4.  RandomAccessFile   5.  对象序列化   6.  标准I/O   7.  进程控制   内容     1.  File类   File类给人的感觉就是文件类,其实对其恰当的诠释却是Filepath(文件路径),java.io.File类不仅可以代表一个特定的文件,还可以代表一个目录下面的一组文件名称.当File指向一个文件集时,就

java IO流文件的读写具体实例(转载)

引言: 关于java IO流的操作是非常常见的,基本上每个项目都会用到,每次遇到都是去网上找一找就行了,屡试不爽.上次突然一个同事问了我java文件的读取,我一下子就懵了第一反应就是去网上找,虽然也能找到,但自己总感觉不是很踏实,所以今天就抽空看了看java IO流的一些操作,感觉还是很有收获的,顺便总结些资料,方便以后进一步的学习... IO流的分类:1.根据流的数据对象来分:高端流:所有的内存中的流都是高端流,比如:InputStreamReader  低端流:所有的外界设备中的流都是低端流

JAVA IO 设计模式彻底分析

一.引子(概括地介绍Java的IO) 无论是哪种编程语言,输入跟输出都是重要的一部分,Java也不例外,而且Java将输入/输出的功能和使用范畴做了很大的扩充.它采用了流的 机制来实现输入/输出,所谓流,就是数据的有序排列,而流可以是从某个源(称为流源或Source of Stream)出来,到某个目的地(称为流汇或Sink of Stream)去的.由流的方向,可以分成输入流和输出流,一个程序从输入流读取数据向输出流写数据. 如,一个程序可以用FileInputStream类从一个磁盘文件读取

《java与设计模式》之装饰模式详解&Java IO中的装饰器模式

1 概述 在一个项目中,你会有非常多的因素考虑不到,特别是业务的变更,不时的冒出一个需求是很正常的情况.有三个继承关系的类:Father.Son.GrandSon,我们要在Son类上增强一些功能怎么办?给Son类增加方法吗?那对GrandSon的影响呢?特别是对GrandSon有多个的情况,你会怎么办?认真看完本文,你会找到你的答案. JavaIO中,像下面的嵌套语句是不是很常见,为什么要怎样定义呢?理解装饰模式后,你会找到答案. DataInputStream in = new DataInp

JAVA IO中的设计模式

在java语言 I/O库的设计中,使用了两个结构模式,即装饰模式和适配器模式.       在任何一种计算机语言中,输入/输出都是一个很重要的部分.与一般的计算机语言相比,java将输入/输出的功能和使用范畴做了很大的扩充.因此输入输出在java语言中占有极为重要的位置.       java语言采用流的机制来实现输入/输出.所谓流,就是数据的有序排列,流可以是从某个源(称为流源,或者 Source of Stream)出来,到某个目的(Sink of Stream)地去.根据流的方向可以将流分

JAVA IO 序列化与设计模式

?更多技术干货请戳:听云博客 序列化 什么是序列化 序列化:保存对象的状态 反序列化:读取保存对象的状态 序列化和序列化是Java提供的一种保存恢复对象状态的机制 序列化有什么用 将数据保存到文件或数据库中时 将数据通过套接字在网络上传输时 通过 RPC RMI等传输对象时 如何序列化 实现Serializable接口 实现Externalizable接口 serialVersionUID的作用serialVersionUID建议给一个确定的值,不要由系统自动生成,否则在增减字段(不能修改字段类

一文看懂java io系统 (转)

出处:  一文看懂java io系统 学习java IO系统,重点是学会IO模型,了解了各种IO模型之后就可以更好的理解java IO Java IO 是一套Java用来读写数据(输入和输出)的API.大部分程序都要处理一些输入,并由输入产生一些输出.Java为此提供了java.io包 java中io系统可以分为Bio,Nio,Aio三种io模型 关于Bio,我们需要知道什么是同步阻塞IO模型,Bio操作的对象:流,以及如何使用Bio进行网络编程,使用Bio进行网络编程的问题 关于Nio,我们需

从设计模式角度理解Java IO基本概念

1.基本概念 1.1.InputStream 最基本的字节输入流,抽象类,定义了读取原始字节的所有基本方法1.1.1.public abstract int read() throws IOException 读取一个字节的方法,最基础的方法1.1.2.public int read(byte b[], int off, int len) 读取指定长度的字节到字节数组,基于方法1.1.11.1.3.public int read(byte b[]) throws IOException 读取一个

Java IO中的设计模式--装饰器和适配器模式

参考:http://my.oschina.net/gao0516/blog/136103 装饰器模式:是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能 适配器模式:将一个类的接口转换成客户希望的另外一个接口 直接上代码分析: package com.think.cla; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class