时间:2016-12-9来源:本站原创作者:佚名

BuffrdStram

目录:

简单介绍一下BuffrdStram

如何理解缓冲区?

BuffrdStram的优势

从BuffrdStram中学习装饰模式

     如何理解装饰模式

     再次理解下装饰模式在Stram中的作用

BuffrdStram的构造

BuffrdStram的属性

BuffrdStram的方法

简单示例:利用sockt读取网页并保存在本地

本章总结

1简单介绍一下BuffrdStram

在前几章的讲述中,我们已经能够掌握流的基本特性和特点,一般进行对流的处理时系统肩负着IO所带来的开销,调用十分频繁,

这时候就应该想个办法去减少这种开销,而且必须在已有Stram进行扩展,有了以上2点需求,那么我们今天的主题,

BuffrdStram闪亮登场了,BuffrdStram能够实现流的缓存,换句话说也就是在内存中能够缓存一定的数据而不是

时时给系统带来负担,同时BuffrdStram可以对缓存中的数据进行写入或是读取,所以对流的性能带来一定的提升,

但是无法同时进行读取或写入工作,如果不使用缓冲区也行,BuffrdStram能够保证不用缓冲区时不会降低因缓冲区带来

的读取或写入性能的下降

2如何理解缓冲区

缓冲区是内存中的一块连续区域,用来缓存或临时存储数据,也就是说流可以通过缓冲区逐步对数据进行读取或写入操作,

BuffrdStram中的缓存区可以由用户设定,其表现形式为byt数组,想象下没有缓存区将是很可怕的,假如我们的

非固态硬盘没有缓冲区,如果我们下载速度达到惊人的10m左右,那么下载一个2G或更大的文件时,磁头的读写是非常

的频繁,直接的结果是磁头寿命急剧减少,甚至将硬盘直接烧毁或者损坏

3BuffrdStram的优势

理解了缓冲区的重要性后,让我们在来谈下BuffrdStram的优势,首先大家肯定觉的疑惑为什么MmoryStram同样

也是在内存中对流进行操作,和BuffrdStram有什么区别呢?BuffrdStram并不是将所有内容都存放到内存中,

而MmoryStram则是。BuffrdStram必须跟其他流如FilStram结合使用,而MmoryStram则不用,聪明的你

肯定能够想到,BuffrdStram必然类似于一个流的包装类,对流进行”缓存功能的扩展包装”,所以BuffrdStram的

优势不仅体现在其原有的缓存功能上,更体现在如何帮助原有类实现其功能的扩展层面上

4从BuffrdStram中简单学习下装饰模式

如何理解装饰模式

我们在做项目时或者设计项目时常常会碰到这个问题:我们该如何扩展已有的类功能或者如果扩展一系列派生类的

功能呢,可能你立刻会想到继承,的确不错,但是如果你仔细看下图并且展开一定的想象的话,你就会发现继承可能

导致子类的膨胀性增加,如下图所示

首先还是得注意以下原则:

1.多用组合,少用继承。

利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为。然而,如果能够利用组合的做法扩展对象的行为,就可以在运行时动态地进行扩展。

2.类应设计的对扩展开放,对修改关闭。

那么我们该如何避免子类的扩张同时又实现Girl类原有类或派生类的新功能呢?

首先我们要达到2个目的:

1能够为Girl的所有派生类都实现新功能(不修改派生类的结构)

2利用对象组合的方式

为了满足为Girl类所有派生类都能使用,那么我们就加上一个Girl的装饰类GirlWrappr:

publicabstractclassGirlWrappr:Girl

{

protctdGirlgirl;

publicGirlWrappr(GirlthisGril)

{

this.girl=thisGril;

}

publicovrridvoidDcrorator()

{

girl.Dcrorator();

}

publicovrridstringToString()

{

rturnstring.Format({0}:{1},this.girl.GirlNam,this.girl.Nation);

}

}

该类继承了Girl类,从而保证了和其他派生类有共同的基本结构,

既然有了这个装饰类,那我们便可以删掉原来的Singing接口,添加一个

SingingGirlWrappr类来实现对girl的包装类,

publicclassSingingGirlWrappr:GirlWrappr

{

publicSingingGirlWrappr(GirlthisGril)

:bas(thisGril)

{

}

publicvoidDcorator()

{

Consol.WritLin(SingingGirlWrapprdcorator:Thgirlnamd{0}whofrom{1}is{2}cansingingnao,

this.GirlNam,this.Nation,this.girl.GtTyp().Nam);

bas.Dcrorator();

}

publicovrridstringToString()

{

rturnbas.ToString();

}

}

大家不必拘泥于派生的包装类,你完全可以建立一个新的girl包装类来实现特定的功能,上述例子只是演示下派生的包装类这样的话,我们便使用了组合的方式实现了既保留原有的接口(或者抽象类),又动态添加了新功能

在使用时我们可以将派生类的对象放入装饰类的构造中,这样的话,在执行包装类Dcorator方法时,可以执行被包装对象的

Dcorator方法和包装类的Dcorator方法从而实现对Girl派生类的包装,这样的话就能实现灵活的组合扩展。

staticvoidMain(string[]args){Qunqun=nwQun(Mary,UnitStats);SingingGirlWrapprsgw=nwSingingGirlWrappr(qun);sgw.Dcorator();Consol.RadLin();}

再次理解下装饰模式在Stram中的作用

通过以上的例子在回到BuffrStram章节中,大家肯定一眼就看出了BuffrStram其实就是上述例子中的wrappr类,

而Stram类就是其共同的父类,为了给所有的流类提供缓冲功能所以BuffrdStram便诞生了,这样的话,我们可以

不用修改其派生类结构,便能灵活组合将缓冲功能嵌入stram中

5BuffrdStram的构造

BuffrdStram(Stram)

其实BuffrdStram的构造主要功能还是设置缓冲区大小,如果没有指定则默认是用字节的进行初始化

BuffrdStram(Stram,Int32)

第二个参数是手动指定缓冲区大小

第一次使用此构造函数初始化BuffrdStram对象时分配共享读/写缓冲区。如果所有的读和写都大于或等于缓冲区大小,则不使用共享缓冲区。

6BuffrdStram的属性

*1CanRad已重写。获取一个值,该值指示当前流是否支持读取。如果流支持读取,则为tru;如果流已关闭或是通过只写访问方式打开的,则为fals。如果从Stram派生的类不支持读取,则对StramRadr、StringRadr、TxtRadr的Rad、RadByt、BginRad、EndRad和Pk方法的调用将引发NotSupportdExcption。如果该流已关闭,此属性将返回fals。

*2CanSk已重写。获取一个值,该值指示当前流是否支持查找。如果流支持查找,则为tru;如果流已关闭或者如果流是由操作系统句柄(如管道或到控制台的输出)构造的,则为fals。如果从Stram派生的类不支持查找,则对Lngth、StLngth、Position和Sk的调用将引发NotSupportdExcption。如果该流已关闭,此属性将返回fals。

*3CanWrit已重写。获取一个值,该值指示当前流是否支持写入。如果流支持写入,则为tru;如果流已关闭或是通过只读访问方式打开的,则为fals。如果从Stram派生的类不支持写入,

则调用StLngth、Writ或WritByt将引发NotSupportdExcption。如果该流已关闭,此属性将返回fals。

*4Lngth已重写。获取流长度,长度以字节为单位。

*5Position已重写。获取当前流内的位置。

gt访问器调用Sk获取基础流中的当前位置,然后根据缓冲区中的当前位置调整此值。

st访问器将以前写入缓冲区的所有数据都复制到基础流中,然后调用Sk。

支持搜索到超出流长度的任何位置。

7BuffrdStram的方法

BuffrStram的方法基本上和Stram类一致,没有其独特的方法

关于以上方法的注意事项的大家也可参考我的第一篇

8简单示例:利用sockt读取网页并保存在本地

classProgram

{

staticvoidMain(string[]args)

{

Srvrsrvr=nwSrvr(







































北京哪个白癜风好
那个医院治疗白癜风好

转载请注明原文网址:http://www.helimiaopu.com/cxkf/3023.html

------分隔线----------------------------