在正确的地方装饰设计模式闪耀,但我注意到在许多应用程序中使用装饰时几乎没有错误。
一个例子(使用java.io
),它证明了使用Decorator时出现的问题。
public OutputStream foo(...){
return new BufferedOutputStream(...);
}
此方法存在问题,它将BufferedOutputStream
返回为OutputStream
,因此用户可以通过BufferedOutputStream
再次修饰此对象(他不知道该方法返回缓冲流))所以在这里我们免费获得双缓冲(更糟糕的是表现更差)。
另一个例子:
public void foo(OutputStream os){
BufferedOutputStream bos = new BufferedOutputStream(is);
...
}
这里有另一个例子,用户可以提供BufferedOutputStream
到foo已经装饰它以供内部使用,用户可能希望通过提供缓冲流来提高性能,但实际上他正在使它更糟糕,它不是他的错,他不知道里面的方法是什么(黑匣子)。
所以任何人都可以告诉我使用Decorator设计模式的最佳做法是什么,不仅仅是java.io
,而是一般用于Decorator?