IO学习之装饰者模式、适配器模式(扩展知识)

来源:互联网 发布:农村淘宝吴集服务站 编辑:程序博客网 时间:2024/05/22 06:58

-------android培训、java培训、期待与您交流! ----------

IO学习概述

写在前面

       这篇博客写的是IO,但是并不是写IO各个操作类的具体功能,学习JAVA差不多快一年,IO流相信是大多数初学者的头疼之处,因为第一印象觉得它的类太多太多了,我也是,着实让我花了不少功夫,这个学期学校开了一门课叫做设计模式,里面有一个装饰者设计模式和适配器模式让我对IO流的体系结构有了一个深的体会。之后在网上看了视频,也参考了别人的博文,结合一下自己的分享给大家,更是给自己一次学习总结。

   无论是哪种编程语言,输入跟输出都是重要的一部分,在Android程序设计中,流相当重要,当然,功能是与JAVA一样的啦,它采用了流的机制来实现输入/输出,所谓流,就是数据的有序排列,而流可以是从某个源出来,到某个目的地去的。由流的方向,可以分成输入流和输出流,一个程序从输入流读取数据向输出流写数据。在我们学习IO之后都会知道Java I/O库具有两个对称性,它们分别是:1、输入-输出对称性,比如InputStream和OutputStream各自占据Byte流的输入与输出的两个平行的等级结构的根部。 而Reader和Writer各自占据Char流的输入与输出的两个平行的等级结构的根部。2、byte-char对称,InputStream和Reader的子类分别负责Byte和Char流的输入;OutputStream和Writer的子类分别负责Byte和Char流的输出,它们分别形成平行的等级结构。这个诀窍我们也是需要注意的额!


一、Java I/O库的两个设计模式:

1、装饰者模式

定义:装饰者模式可以动态地给一个对象增加其他职责,就扩展对象功能来说,装饰者模式比生成子类更为灵活。

 在由InputStream,OutputStream,Reader和Writer代表的等级结构内部,有一些流处理器可以对另一些流处理器起到装饰作用,形成新的,具有改善了的功能的流处理器。装饰者模式是Java I/O库的整体设计模式。这样的一个原则是符合装饰者模式的。类图如下:


类图解释:
Component(被装饰对象基类)
定义对象的接口,可以给这些对象动态增加职责;
ConcreteComponent(具体被装饰对象)
定义具体的对象,Decorator可以给它增加额外的职责;
Decorator(装饰者抽象类)
维护一个指向Component实例的引用,并且定义了与Component一致的接口;
ConcreteDecorator(具体装饰者)

也许你看了这个还不知道是怎么被装饰的,没关系,再看下面这个序列图。



       或许大家会问为对象添加功能,我们用继承不就可以了吗?那这里的装饰模式和我们的IO体系结构有什么关系,还是不太明白!

我们先看《Head first 设计模式》中关于装饰模式的一个例子,看看装饰模式是怎样得到应用的。它这个例子大概是说:Beverage是一个抽象类,它被所有在一个咖啡店里卖的饮料继承。Beverage有个抽象方法cost,所有的子类都要实现这个抽象方法,计算它们的价格。现在有四个最基本的咖啡:HouseBlend,DarkRoast,Decaf,Espresso他们都继承自Beverage,现在的需求是说在四个最基本的咖啡里,每个都可以随便地添加调味品,像steamed milk,soy,还有mocha最后是加上whipped milk。如果是说按继承来实现这种几个调味品跟原来咖啡的组合的话,我们会很自然地设计来下面的类图来:


看了上面的类图,你一定有话要说!是的!这简直是太恐怖了,好像是整个类图都要爆炸了一样,而且以后随便增加一种调味品,继承于Beverage的子类还会 翻倍!这样的系统维护起来浭水异常噩梦,如果是按装饰模式的设计思路我们可以得出下面的设计类图:

可见装饰模式的使用,不仅类的数目大减少了,性能的重复也可以减至到最少。我们知道Java I/O库需要很多性能的各种组合,如果说这些性能的组合是通过继承方式来实现的话,那么每一种组合都需要一个类,这样就会出现大量重复性问题的出现,从而使类数目“爆炸”。而如果采用装饰模式,那么不仅类的数目大减少了,性能的重复也可以减至到最少。所以装饰模式是Java I/O库的基本模式。再回到Java I/O库,由于装饰模式的引用,造成了灵活性和复杂都大大增加了,我们在使用Java I/O库时,必须理解Java I/O库是由一些基本的原始流处理器和围绕它们的装饰流处理器所组成的,这样可以在学习和使用Java I/O库时达到事半功倍的效果。

 首先是InputStream类型中的装饰模式:


对于上图FilterInputStream查看JDK1.4源代码,部分代码如下:

Public class FilterInputStream extends InputStream {
    /**
     * The input stream to be filtered.
     */
    protected InputStream in;
    protected FilterInputStream(InputStream in) {
        this.in = in;
    }
    //其它代码
}

Java语言的I/O库提供了四大等级结构:InputStream,OutputStream,Reader,Writer四个系列的类。InputStream和OutputStream处理8位字节流数据, Reader和Writer处理16位的字符流数据。InputStream和Reader处理输入, OutputStream和Writer处理输出,所以OutputStream,Reader,Writer这三类的装饰模式跟前面详细介绍的InputStream装饰模式大同小异。

二、适配器模式

属于结构型模式,其主要作用是将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。在IO中,在由InputStream,OutputStream,Reader和Writer代表的等级结构内部,有一些流处理器是对其它类型的流源的适配。这就是适配器模式的应用。
比如:
 ByteArrayInputStream是一个适配器类,ByteArrayInputStream继承了InputStream的接口,而封装了一个byte数组。换言之,它将一个byte数组的接口适配成InputStream流处理器的接口。
    从byte流到char流的适配,在Java I/O库中,使用比较频繁的要数InputStreamReader,OutputStreamWriter这两种类了, InputStreamReader是从byte输入流到char输入流的一个适配器。

适配器模式模式在这里就不贴出类图了,明天博客将详细介绍IO体系结构中常用类的功能。。。


0 0
原创粉丝点击