30日学习笔记,关于java的IO系统已经Decorarot模式

来源:互联网 发布:java按行读取文本文件 编辑:程序博客网 时间:2024/04/27 18:43

这是纯技术性质的总结,所以果断不废话。

 

关于 java I/O处理,其实我个人认为如果从一般学习者就是之前没有经验的人开始理解起来确实是比较困难的,这里我要作出一个对比,我想表达的是别人不曾表达的东西,关于概念性的基础中的基础的问题(比如说流是如何被比喻的,还有就是各种语法问题,就不再这里继续占用篇幅了,很多人都写到了,我只写我自己认为值得参考的那些方面),一开始我自己研究java IO的时候是从<java编程思想第四版>中的java IO部分开始看起的,因为之前只有一丁点c++经验,然而java IO是由类驱动起来的,而且用了很深的decorator模式,那个时候的我确实不知道这是什么层次的概念,只知道一点关于工厂的东西(其实就是如何写的一些步骤和方法,至于真正的设计原理现在也不是特别清楚),而且看书中的例子,初步要进行IO操作的话是有很多装饰的,语法看起来就复杂的多,一开始很不理解为什么就要 new里面 再写一个new ,有的不止有2个,这样恐怖的构造感觉压力很大,而且就我 thinking in java中的java io开篇来说,一上来就是说File类的相关介绍,关于File类的困惑其实就可以写很长了,今天在写一个文件复制类的时候,因为一些设计不到位的问题差点把写了半天的程序废了,虽然不多,但是我认为在初步的时候是进步最快的,不管你能写多少,或者有多不懂。问题之一就在于文件在保存的时候 File类的mkdirs()方法的目录创建问题,会导致文件和目录的判断无效直接建立和文件名一样的文件夹导致异常,然后在下次写入的时候会发现无权限操作,原因是已经有了和文件名一样的一个文件夹,到现在我一直认为File类对文件的描述并不全面,问题之一就是目录问题,并不是说它设计的不好,thinking in java 中已经说明了,File其实描述目录更多一点,有很多例如list()的方法,可以内插一个继承自 FilenameFilter类的带有Regex的过滤装置,这样你的记事本就可以只读取一些特定文件后缀的文件了,*nix系统需要判断文件头,不过貌似没这个必要。

 

其实不管写什么,我认为设计是优于算法的,或者说设计是重中之重,所以要建立起比较健全的概念之后你才可以自由发挥的比较好,这也是我一直想做到的,所以一直绞尽脑汁想去写这些东西,当然前提是必须有hackers的探索精神以及 Greenday类似的朋克精神,我认为使用各种IDE不是一件特别cool的事情,确实是这样,从java IO系统中可以看到的是java过于严肃了,而且让很多人都很难以设计,虽然java 是以设计著称的。

 

下面来讨论一下著名的设计模式之中的 装饰模式。

下面上一个 uml

MyInterface
           |
_______|_______
|                    | 
Myclass     Decorator
              ____|_____
              |              | 
    DecoratorA      DecoratorB

其实就  BufferedReader read = new BufferedReader(newFIleReader(new File(“./1.txt”)));

这样的含有超级构造器的构造方法是无法让一个人比较透彻的了解到底他妈的什么是惊喜的,所以我认为上面的uml图是十分棒的东西,确实可以帮到你,如果你愿意去亲自看一看到底java的设计者或者说是工程师们是如何设计他们自己的 IO系统的,可以去简单看一下源程序,不用全部看了,只看其中的某些就可以了,其实最上面的那个接口是很多情况下你没有看到的东西之一,如果要遇到具体的设计的话,菜鸟很容易困惑,上面的uml是什么意思,虽然我也是菜鸟,但是根据自己的经验来写一下。

MyInterFace是装饰类和原类共同有的一个接口,里面可以写上自己需要随时做出改变的方法,MyClass是实实在在的自己想要操作的类,里面有自己想要装饰的方法。

总的来说是先要有一个被修饰的对象,然后实现同样的接口,之后在通过扩充接口来实现功能,这是适配器模式的一个变种,不一样的地方是适配器模式需要实现另外的接口,而装饰模式只需要实现当前的接口就可以了。

 

装饰器一般要有被装饰类的句柄,这样才可以对其要装饰的方法进行扩充。看我下面的例子吧;

 

Public interface MyInterFace{

 

       Public void sayHi();

 

}

这是装饰类和被装饰类都要实现的接口

 

Public class MyClass implements MyInterFace{

      

       Public void sayHi(){

 

              System.out.println(“helloworld”);

}

}

这是我们的被装饰类,这个时候如果想操纵sayHi()方法的行为可以直接继承覆盖该方法,但是今天要说的是装饰。

 

Class Decorator1 implements MyInterFace{

 

       Private MyInterFacesource;

       Public Decorator1(MyInterFaces){

 

              Source = s;

 

}

Public void sayHi(){

 

       Source.sayHi();

Syatem.out.println(“to me”);

 

}

 

}

 

这是一个装饰类,可以实现输出hello world to me;

Class Decortor2 implements MyInterFace{

 

       Private MyInterFacesource;

       Public Decortor2(MyInterFaces){

             

                     Source =s;

}

Public void sayHi(){

 

       Source.sayHI();

System.out.println(“to you”);

}

 

}

 

然后我们这样写

MyInterface s = new Decortor1(new Decortor2(new MyClass()));

就可以实现多种效果了

 

具体的我也只理解了这么多吧,12点半了,睡觉吧还是。

想考SCJP,上帝保佑~

原创粉丝点击