美文网首页java语言基础
【Java IO】 六、java io装饰模式浅谈

【Java IO】 六、java io装饰模式浅谈

作者: 6d898101c4c9 | 来源:发表于2018-12-20 15:06 被阅读1次

前面提到的那些类都只是对字节数组,或者字符数组这类数据的操作,
如果我们想要想在流中输入或输出的是Long,Int,Double,这样的基本类型呢?
其实这样的类 java io代码中已经有了,即为DataInputStream,和DataOutputStream
并且使用了一个设计模式——装饰模式。

一,装饰模式简介

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
来看以下的例子:

public class DataOutputStreamExample {
    public static void main(String[] args) throws Exception {

        long a=12131414;

        //创建一个字节数组输出流
        ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
        //放入dataoutputStraam进行装饰
        DataOutputStream dataOutputStream=new DataOutputStream(outputStream);
        //写入long
        dataOutputStream.writeLong(a);

        //将流中的内容输出到byte[]中
        byte[] bytes=  outputStream.toByteArray();
        //再创建byte的输入流,bytes作为数据源
        ByteArrayInputStream inputStream=new ByteArrayInputStream(bytes);
        //装饰
        DataInputStream dataInputStream=new DataInputStream(inputStream);
        //输出
        System.out.println(dataInputStream.readLong());

    }
}

以上的代码中 ByteArrayOutputStream 继承了OutputStream,
后面又将OutPutStream作为构造参数传给了DataOutputStream,
这样,那个简单的输出流,就可以写入Long型了。

new DataOutputStream(outputStream)

这是如何实现的呢?,简单的包装就扩展了原本的类的功能

实际的原因很简单,就是在这个DataOutputStream中有一个成员变量即是OutputSteam 。任何继承了OutputSteam这个类的子类都可以作为构造参数传入,实现功能的扩展。

以下为FilterOutSteam的源码:

    protected OutputStream out;

    public FilterOutputStream(OutputStream out) {
        this.out = out;
    }

二,各个类在装饰模式中扮演的角色

1.抽象构件(Component)角色:由InputStream,和 OutputSteam扮演。这是一个抽象类,为各种子类型处理器提供统一的接口。
(也就是说,只要一个类继承了这个抽象构建,就能使用装饰角色进行装饰)

2.具体构建(Concrete Component)角色:由ByteArrayInputStream、FileInputStream以及StringBufferInputStream等原始流处理器扮演。它们实现了抽象构建角色所规定的接口,可以被链接流处理器所装饰。
(一个符合抽象构件规范的具体构件)

  1. 抽象装饰(Decorator)角色:由FilterInputStream扮演。它实现了InputStream所规定的接口。
    (可以理解为对所有装饰角色的一个规范,任何继承了这个类的具体装饰角色,可以装饰继承了抽象构件角色的类)

  2. 具体装饰(Concrete Decorator)角色:由几个类扮演,分别是DateInputStream、BufferedInputStream 以及两个不常用到的类LineNumberInputStream和PushbackInputStream。

三,个人理解及总结

抽象构件(Component)角色 和 抽象装饰(Decorator)角色,
是对被装饰角色 和 装饰角色的一个规范。
就像是两个可以组合的零件,只要符合规范,任意一个都可以被随意替换,这便是装饰模式的好处吧。

相关文章

  • 【Java IO】 六、java io装饰模式浅谈

    前面提到的那些类都只是对字节数组,或者字符数组这类数据的操作,如果我们想要想在流中输入或输出的是Long,Int,...

  • Java设计模式-装饰器模式

    Java程序员们应该对java.io对不会陌生,因为java.io包采用了装饰器模式。 一、定义: Decorat...

  • java IO 的知识总结

    装饰者模式 因为java的IO是基于装饰者模式设计的,所以要了解掌握IO 必须要先清楚什么事装饰者模式(装饰者模式...

  • Java IO小小的心得

    学习JAVA IO之前必须要先学习装饰模式 上面是Java中创建一个文件对象的语句,Java在IO库的设计中使用了...

  • 让你再也忘不了IO相关知识-Java IO图文详解

    1 装饰模式 Java中IO使用的是装饰模式,装饰模式在Android中很常见,比如系统的Context。 装饰模...

  • java基础之IO流(设计模式)

    java IO流的设计是基于装饰者模式&适配模式,面对IO流庞大的包装类体系,核心是要抓住其功能所对应的装饰类。 ...

  • 「java」十分钟学会IO

    JAVA IO装饰者模式: 不知道大家在学JAVA IO的时候,有没有被各种五花八门的构造函数之间的组合和嵌套...

  • JAVA IO基础知识

    JAVA IO流采用的是装饰器设计模式,通过IO操作可以完成对特定设备进行数据的读写操作,深入理解IO的设计和使用...

  • JAVA NIO之浅谈内存映射文件原理与DirectMemory

    转自 [Java][IO]JAVA NIO之浅谈内存映射文件原理与DirectMemory Java类库中的NIO...

  • Java的IO和NIO

    Java的IO和NIO 一、Java的IO Java的IO功能在java.io包下,包括输入、输出两种IO流,每种...

网友评论

    本文标题:【Java IO】 六、java io装饰模式浅谈

    本文链接:https://www.haomeiwen.com/subject/xktykqtx.html