如何理解装饰模式
再次理解下装饰模式在Stream中的感化
1 简单介绍一下BufferedStream
在前几章的讲述中,我们已经能够掌握流的根基特性和特点,一般进行对流的措置惩罚惩罚时系统肩负着IO所带来的开销,挪用十分频繁,
这时候就应该想个步伐去减少这种开销,而且必需在已有Stream进行扩展,有了以上2点需求,那么我们今天的主题,
BufferedStream闪亮登场了,BufferedStream能够实现流的缓存,,换句话说也就是在内存中能够缓存必然的数据而不是
不时给系统带来承担,同时BufferedStream可以对缓存中的数据进行写入或是读取,所以对流的性能带来必然的提升,
但是无法同时进行读取或写入事情,如果不使用缓冲区也行,BufferedStream能够保证不用缓冲区时不会降低因缓冲区带来
的读取或写入性能的下降
2 如何理解缓冲区
缓冲区是内存中的一块持续区域,用来缓存或姑且存储数据,也就是说流可以通过缓冲区逐步对数据进行读取或写入操纵,
BufferedStream 中的缓存区可以由用户设定,其表示形式为byte数组,想象下没有缓存区将是很可怕的,假如我们的
非固态硬盘没有缓冲区,如果我们下载速度到达惊人的10m摆布,那么下载一个2G或更大的文件时,磁头的读写长短常
的频繁,直接的功效是磁头寿命急剧减少,甚至将硬盘直接烧毁或者损坏
3 BufferedStream的优势
理解了缓冲区的重要性后,让我们在来谈下BufferedStream的优势,首先大家必定觉的疑惑为什么MemoryStream 同样
也是在内存中对流进行操纵,和BufferedStream有什么区别呢?BufferedStream并不是将所有内容都存放到内存中,
而MemoryStream则是。BufferedStream必需跟其他流如FileStream结合使用,而MemoryStream则不用,聪明的你
必定能够想到,BufferedStream一定类似于一个流的包装类,对流进行”缓存成果的扩展包装”,所以BufferedStream的
优势不只表此刻其原有的缓存成果上,更表此刻如何辅佐原有类实现其成果的扩展层面上
4 从BufferedStream 中简单学习下装饰模式
如何理解装饰模式
我们在做项目时或者设计项目时每每会碰到这个问题 :我们该如何扩展已有的类成果或者如果扩展一系列派生类的
成果呢,可能你立刻会想到担任,简直不错,但是如果你仔细看下图并且展开必然的想象的话,你就会发明担任可能
导致子类的膨胀性增加,如下图所示
首先还是得注意以下原则:
1. 多用组合,少用担任。
操作担任设计子类的行为,是在编译时静态决定的,而且所有的子类城市担任到不异的行为。然而,如果能够操作组合的做法扩展东西的行为,就可以在运行时动态地进行扩展。
2. 类应设计的对扩展开放,对改削*。
那么我们该如何制止子类的扩张同时又实现Girl类原有类或派生类的新成果呢?
首先我们要到达2个目的:
1 能够为Girl的所有派生类都实现新成果(不改削派生类的布局)
2 操作东西组合的方法
为了满足为Girl 类所有派生类都能使用,那么我们就加上一个Girl的装饰类GirlWrapper:
public abstract class GirlWrapper : Girl { protected Girl girl; public GirlWrapper(Girl thisGril) { this.girl = thisGril; } public override void Decrorator() { girl.Decrorator(); } public override string ToString() { return string.Format("{0}:{1}", this.girl.GirlName, this.girl.Nation); } }
该类担任了Girl类,从而保证了和其他派生类有配合的根基布局,
既然有了这个装饰类,那我们便可以删失本来的Singing 接口,添加一个
SingingGirlWrapper类来实现对girl的包装类,