学习设计模式的人都知道装饰者模式,本人一样,而且看过很多不同的人写的,但每次的认识都不相同,以下本人最新的体会,不对之处请指出。
我认为装饰者模式是即用了继承,又使用了复合,所以它即有继承的好处也有复合的优点,一种静态和动态的结合。最终,实现的可以以静态的方式了手动动态增强类的功能,而无需修改原来的代码。(继承自己,又复用自己)。所以了解继承和复合的人应该可以理解。
装饰器模式以对客户端透明的方式扩展对象的功能,适合用来建立有弹性的设计,维持开放-关闭原则。看看装饰器的代码特征
InputStream in =new LowerCaseInputStream(new BufferedInputStream(new FileInputStream("test.txt"))); 你可以这样不停的嵌套去扩展功能。理论上可以达到无数个。 上面的代码也说明了我第一段说的,一种静态的动态。
它是如何遵守开闭原则的呢? 看上面的代码,如果你已经实现了FileInputStream,现在,你想增加一个缓冲功能,你并没有改动FileInputStream,而是开发了一个新的BufferedInputStream,这就是开闭原则的体现, LowerCaseInputStream也是一样的。这就是我认为它可以动的地方,在开发是你可以无限的增加这样的类。但是,一旦编译之后,就不能在改变了,你想让三个变成四个就不行,你想让LowerCaseInputStream变成UpperCaseInputStream也不行了。这就是我认为他静的地方。
动是它的优点,静是它的缺点。如何克服它的缺点呢?正在考虑中?思路依然是使用接口和复合
我认为Head First设计模式中关于咖啡的例子并不太恰当,因为如果仅仅计算价格只需要取出每种物品的单价做加法即可,如果是分大小杯也一样,是做加减法或乘除法就可以搞定。JDK中I/O的处理我认为更加合适。