InputStream in = new LineNumberInputStream(new BufferedInputStream(new FileInputStream("test.txt")));

这在java里面算个比较常见的定义,刚开始可能不明白为什么要包这么多层,甚至更多。正好这几天看设计模式,原来这是装饰者模式,里面一层经过装饰得到外面一层,在不改变原有的类定义的基础上获得更多的功能和属性。但这可能会加入大量的小类,让人难以理解。

《Head First Design Patterns》一书里面用了StarBuzzCoffee的例子。最高层是一个抽象的Beverage(普通意义的饮料),它之下有DarkRoast、Espresso、HouseBleand几个具体的饮料类。然后CondimentDecorator(抽象的添加品,如糖、牛奶等)也继承了Beverage,因为饮料加入糖之后还是饮料,CondimentDecorator中还有一个Beverage对象,作为之前已经配好的饮料,现在又要加如一种调料;Mocha、Soy、Whip是几种具体的调料。

Beverage beverage = new HouseBlend();

beverage = new Soy(beverage);

beverage = new Mocha(beverage);

beverage = new Whip(beverage);

上面几行代码就可以表示加入Soy、Mocha、Whip的HouseBlend。

同理,FileInputStream可以读取文本文件,BufferedInputStream加入了读取一行的功能,LineNumberInputStream增加了计算行数的功能。

 

java.io为什么有那么多Stream?_java.io

可以想象成这种结果。图片来自《Head First Design Patterns》。

如果没讲清楚,请查阅相关文献。